使用Filebeat收集线上docker日志

Filebeat官网:https://www.elastic.co/guide/en/beats/filebeat/index.html

警告:这里一定要检查好自己安装的filebeat是哪个版本。然后在官网对应版本下,进行参数设置;避免踩坑。


一、概述

  • Filebeat是Beat成员之一,基于Go语言开发,并且无需添加任何依赖,Logstashfilebeat都具有日志收集的功能,而filebeat更轻量,占用资源更少,所以filebeat一般都安装在客户端服务器,用来在客户端上收集日志,最终传输给Logstash进行分析。

  • Filebeat由两个主要组件构成:harvestersprospector 。这两类组件一起协同完成Filebeat的工作,input在指定路径文件中把数据读取出来;之后发送事件数据到配置的output中。


  • Harvesters负责进行单个文件的内容收集,在执行过程中,每一个Harvester会对一个文件进行逐行内容读取,并且把读取到的内容发送到配置的output中。

  • Prospector负责管理Harvsters,并且找到所有需要进行读取的数据源。如果input 配置的是log (日志) 类型,Prospector将会去配置的路径下,查找所有匹配的文件,最后为每一个文件创建一个Harvster


input-log相关属性配置见:https://www.elastic.co/guide/en/beats/filebeat/6.5/filebeat-input-log.html
output-redis相关属性配置见:https://www.elastic.co/guide/en/beats/filebeat/6.5/redis-output.html



参照我公司的环境及配置,详细介绍一下filebeat的参数设置。版本:6.5.4

线上 filebeat配置:

filebeat.inputs:
# 这里为收集docker的所有日志
- type: log                                                 
  enabled: true                                             
  paths:                                                    
    - "/qj/docker/data/docker/containers/*/*-json.log"      
  scan_frequency: 6s                                        
  harvester_buffer_size: 16384                                   
  max_bytes: 10485760                                              
  fields:                                                  
    level: debug                                                
    fields_under_root: true                                         
    log_topics: ali245                                              
  encoding: utf-8                                           
  json:                                                    
    json.keys_under_root: true                                              
    json.add_error_key: true                                                
    json.message_key: log                                               
  tail_files: true                                              
  processors:                                               
  - add_docker_metadata:                                                
      host: "unix:///var/run/docker.sock"                                               
      match_source: true                                                
      match_source_index: 5                                             

# 这里为收集Nginx访问日志
- type: log                                                 
  enabled: true                                             
  encoding: utf-8                                               
  paths:                                                
    - "/qj/nginx/log/access.log"                                                
  fields:                                               
    log_topics: nginx                                               

# 这里为收集Nginx错误日志
- type: log                                             
  enabled: true                                             
  encoding: utf-8                                               
  paths:                                                
    - "/qj/nginx/log/error.log"                                             
  fields:                                               
    log_topics: nerror                                              

# 这里为收集Mysql的慢日志
- type: log                                             
  enabled: true                                             
  paths:                                                
    - "/qj/mysql/data3306/slow.log"                                             
  backoff: 1s                                               
  max_backoff: 10s                                              
  backoff_factor: 2                                             
  harvester_limit: 10                                               
  multiline.pattern: "^# User@Host:"                                            
  multiline.negate: true                                                
  multiline.match: after                                                
  multiline.timeout: 5s                                             
  fields:                                               
    log_topics: slow                                                
                                                
queue.mem:                                              
  events: 8192                                              
  flush.min_events: 4096                                                
  flush.timeout: 60s                                                
                                                
force_close_files: true                                             
                                                
output.redis:                                               
  hosts: ["172.17.3.102:6379"]                                              
  key: "ali1_log"                                               
  keys:                                             
    - key: "{[fields.list]}"                                                
      mappings:                                             
        log_topics: "ali245"                                                
        log_topics: "nginx"                                             
        log_topics: "nerror"                                                
        log_topics: "slow"                                              
  db: 1                                             
  timeout: 5                                                

input输入部分

1. 收集docker日志注解:

# 指定filebeat的输入类型 
filebeat.inputs:

# 使用的是log日志收集类型
type: log                                   

# 启用和禁用输入。默认情况下,enabled设置为true。
enabled: true

# 指定要收集的日志路径,这里为收集docker的日志   
paths:                      

# 文件名和目录名都可以用通配符,但是/qj/*/*.log 是不包括/qj 根目录的文件的
- "/qj/docker/data/docker/containers/*/*-json.log" 

# 收集路径中新文件的频率,每6s更新一次,不要设置太低,不然Filebeat会抢占CPU资源,默认为10s
scan_frequency: 6s                                        

# 每个harvester (收集器) 在获取文件时使用的缓冲区大小(单位字节),默认为16384      
harvester_buffer_size: 16384

# 单个日志消息可以具有的最大字节数,多出的字节会被丢弃。默认值为10M(40485760 bytes)    
max_bytes: 10485760                                       

# 添加额外的字段
fields:                                 

# 向输出的每一条日志添加额外的信息,比如“level:debug”,方便后续对日志进行分组统计。
# 默认情况下,会在输出信息的fields子目录下以指定的新增fields建立子目录,例如fields.level
# 这个得意思就是会在es中多添加一个字段,格式为 "filelds":{"level":"debug"}
level: debug                                                
    
# 如果设置为true:则field 字段会放在根目录下;否则会放在 fields 目录下;自定义的field会覆盖filebeat默认的field。
fields_under_root: true                                   

# redis中topic名称。方便后续对日志进行分组统计,为了让不同类型的日志记录到不同index,实现日志分类
log_topics: ali245                                              

# 用于读取包含国际字符的数据的文件编码   
encoding: utf-8                          

# 这些选项使Filebeat能够解码作为JSON消息结构的日志。Filebeat逐行处理日志,因此只有在每行有一个JSON对象时,JSON解码才能工作。
json:                                             

# 以下官方推荐配置:
json.keys_under_root: true
json.add_error_key: true
json.message_key: log

# 此选项适用于Filebeat尚未处理的文件,如果设置为true,Filebeat从文件尾开始监控文件新增内容把新增的每一行文件作为一个事件依次发送而不是从文件开始处重新发送所有内容。
# 官网推荐:第一次在一组日志文件上运行Filebeat时,可以使用此设置来避免索引旧日志行。第一次运行后,我们建议您禁用此选项,否则您可能会在文件轮换期间丢失线路。
tail_files: false

# 要应用于输入数据的处理器列表。
processors:

# 添加docker元数据    
- add_docker_metadata:

# Docker套接字(UNIX或TCP套接字)。unix:///var/run/docker.sock默认使用
host: "unix:///var/run/docker.sock"

# 匹配source字段中存在的日志路径的容器ID 。默认情况下启用
match_source: true

# 源路径中的索引拆分/以查找容器ID。它默认为4匹配 /var/lib/docker/containers//*.log   
# 参照本文配置:/qj/docker/data/docker/containers/container_id/*-json.log 这里为第5层。
match_source_index: 5



2. 收集Nginx日志注解:

# 要将不同的配置设置应用于不同的文件,需要定义多个输入节
# 这里为收集Nginx访问日志
- type: log
  enabled: true                                             
  encoding: utf-8                                               
  paths:                                                
    - "/qj/nginx/log/access.log"                                                
  fields:                                               
    log_topics: nginx                                               

# 这里为收集Nginx错误日志
- type: log                                             
  enabled: true                                             
  encoding: utf-8                                               
  paths:                                                
    - "/qj/nginx/log/error.log"                                             
  fields:                                               
    log_topics: nerror                                              

"这里的配置和docker日志收集都是一样的,唯一不同的就是 fields添加额外字段"
redis中topic名称。方便后续对日志进行分组统计,为了让不同类型的日志记录到不同index,实现日志分类。
所以访问Nginx日志的topics为nginx
Nginx错误日志的topics为nerror




3. 收集Mysql慢日志注解:

# 这里为收集Mysql慢日志
- type: log                                             
  enabled: true                                             
  paths:                                                
    - "/qj/mysql/data3306/slow.log"                                             

# Filebeat检测到某个文件到了EOF(末尾)之后,每次等待多久再去检测文件是否有更新,默认为1s。
backoff: 1s

# Filebeat检测到某个文件到了EOF之后等待检测文件更新的最大时间,默认是10秒。
# max_backoff无论指定的是什么 ,等待时间都不会超过backoff_factor
max_backoff: 10s                                              

# 此选项指定等待时间增加的速度。backoff因子越大,max_backoff达到的值越快。backoff因子呈指数增量。允许的最小值为1.如果此值设置为1,则禁用backoff算法
# 该backoff值用于等待新行。该backoff数值将随着每一次相乘backoff_factor,直至max_backoff达到。默认值为2。
backoff_factor: 2                                             

# 该harvester_limit选项限制一个输入并行启动的收集器数量。默认harvester_limit值为0,表示没有限制.
# 如果要获取的文件数超过操作系统的打开文件处理程序限制,则此配置很有用。
harvester_limit: 10                                               

# multiline为控制Filebeat如何处理每一条日志消息占据多行的选项。
# 详细参数见:https://www.elastic.co/guide/en/beats/filebeat/6.5/multiline-examples.html

# pattern,指定要匹配的正则表达式模式。
multiline.pattern: "^# User@Host: "                                               

# negate,定义模式是否被否定。默认是false。
multiline.negate: true

# match,指定Filebeat如何将匹配行组合到事件中 (与模式不匹配的连续行将附加到匹配的上一行。)
multiline.match: after

# timeout,在指定的超时后,即使没有找到新模式来启动新事件,Filebeat也会发送多行事件。默认值为5秒。
multiline.timeout: 5s                     

# Mysql慢日志的topics为slow
  fields:                                               
    log_topics: slow                                                



output输出部分

# 引入了queue.mem设置,配置内存队列  (内存队列将所有事件保存在内存中。)    
queue.mem:                               

# 如果未配置刷新间隔且没有要刷新的事件数,则发布到此队列的所有事件将由输出直接使用
# 要在队列中强制执行假脱机,请设置flush.min_events和flush.timeout选项。
# 默认flush.min.events设置为2048并flush.timeout设置为1s。
  events: 8192                        # 队列可以存储的事件数,默认值为4096个事件。                    
  flush.min_events: 4096              # 发布所需的最少事件数。如果此值设置为0,则输出可以开始发布事件而无需额外的等待时间。否则输出必须等待更多事件变为可用。默认值2048
  flush.timeout: 60s                  # 最长等待时间flush.min_events。如果设置为0,则事件将立即可供使用。默认值为1秒                              

# 选项设置为true ,可以在文件名更改后立即强制Filebeat关闭文件 。默认值为false。
force_close_files: true                                             

# 配置输出
output.redis:                           

# 要连接的Redis服务器列表。如果启用了负载平衡(需用逗号隔开),则会将事件分发到列表中的服务器。如果一台服务器无法访问,则事件仅分发给可访问的服务器。
  hosts: ["172.17.3.102:6379"]                    

# 发布事件的Redis列表或通道的名称。如果未配置,index则使用该设置的值。
  key: "ali1_log"                                               
  
# keys为一组键值选择器规则。每个规则指定key用于与规则匹配的事件。
  keys:                                             
    - key: "{[fields.list]}"      # 此配置使用自定义字段fields.list来设置Redis列表键。 
    
# 获取返回值的字典,并将其key映射到新名称。
      mappings:                                             
        log_topics: "ali245"                                                
        log_topics: "nginx"                                             
        log_topics: "nerror"                                                
        log_topics: "slow"            
        
# 发布事件的Redis数据库编号。默认值为0。
  db: 1                                 

# Redis连接超时(以秒为单位)。默认值为5秒。
  timeout: 5          



通过上面一个复杂的案例注解,现在看一些简单的filebeat配置,就容易理解的多了。

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - "/qj/docker-data/containers/*/*-json.log"
  encoding: utf-8
  json:
    json.keys_under_root: true
    json.add_error_key: true
    json.message_key: log
  tail_files: true
processors:
- add_docker_metadata:
    host: "unix:///var/run/docker.sock"
    match_source: true
    match_source_index: 3
output.redis:
  hosts: ["172.17.3.102:6379"]
  key: "ali2_log"
  db: 2
  timeout: 5

好了,filebeat的配置就到这里了,更多收集项还需根据真实环境去配置。过些日子公司要上k8s,所以filebeat还要进行大规模修改。

第一篇文章,写的不好还请担待,如果本篇文章对你有帮助,还请关注我,以后会定期分享技术干货。

转载注明原文:使用Filebeat收集线上docker日志

你可能感兴趣的:(使用Filebeat收集线上docker日志)