filebeat配置文件详解

filebeat.prospectors:

#日志类型
- type: log
  enabled: True

  # 日志路径可以写多个,支持通配符
  paths:
    - /tmp/test.log

#设置字符集编码
  encoding: utf-8

#文档类型(6.x已经开始弃用)
  document_type: my-nginx-log

#每十秒扫描一次,如果设置为0s,则Filebeat会尽可能快地感知更新(占用的CPU会变高)。默认是10s
 scan_frequency: 10s
# 实际读取文件时,每次读取 16384 字节
  harverster_buffer_size: 16384

# 一次发生的log大小值;
  max_bytes: 10485760

#给日志加上tags方便在logstash过滤日志的时候做判断
  tags: ["nginx-access"]

#剔除以.gz 结尾的文件
  exclude_files: [".gz$"]
# 包含输入中符合正则表达式列表的那些行(默认包含所有行),include_lines执行完毕之后会执行exclude_lines
  include_lines: ["^ERR", "^WARN"]
# 在输入中排除符合正则表达式列表的那些行。
 exclude_lines: ["^DBG"]
# 这个得意思就是会在es中多添加一个字段,格式为 "filelds":{"level":"debug"}
  fields:
    level: debug
    review: 1
 # 如果该选项设置为true,则新增fields成为顶级目录,而不是将其放在fields目录下。自定义的field会覆盖filebeat默认的field 
  #如果设置为true,则在es中新增的字段格式为:"level":"debug"
  fields_under_root: false
# 可以指定Filebeat忽略指定时间段以外修改的日志内容,比如2h(两个小时)或者5m(5分钟)。
 ignore_older: 0
# 如果一个文件在某个时间段内没有发生过更新,则关闭监控的文件handle。默认1h
 close_older: 1h
# for Java Stack Traces or C-Line Continuation
# 适用于日志中每一条日志占据多行的情况,比如各种语言的报错信息调用栈
multiline:
# 多行日志开始的那一行匹配的pattern
 pattern: ^\[
# 是否需要对pattern条件转置使用,不翻转设为true,反转设置为false。  【建议设置为true】
 negate: false
# 匹配pattern后,与前面(before)还是后面(after)的内容合并为一条日志
 match: after
# 合并的最多行数(包含匹配pattern的那一行)
max_lines: 500
# 到了timeout之后,即使没有匹配一个新的pattern(发生一个新的事件),也把已经匹配的日志事件发送出去
timeout: 5s
# 如果设置为true,Filebeat从文件尾开始监控文件新增内容,把新增的每一行文件作为一个事件依次发送,而不是从文件开始处重新发送所有内容
 tail_files: false
# Filebeat检测到某个文件到了EOF(文件结尾)之后,每次等待多久再去检测文件是否有更新,默认为1s
 backoff: 1s
# 如果要在本配置文件中引入其他位置的配置文件,可以写在这里(需要写完整路径),但是只处理prospector的部分
 config_dir:

#output 部分的配置文档

#配置输出为kafka,无论你是tar包还是rpm安装,目录里边会看到官方提供的filebeat.full.yml OR filebeat.reference.yml 这里边有filebeat 所有的input 方法和output 方法供你参考;
output.kafka:     
  enabled: true

#kafka 的server,可以配置集群,例子如下:
  hosts:["ip:9092","ip2:9092","ip3:9092"]

#这个非常重要,filebeat作为provider,把数据输入到kafka里边,logstash 作为消费者去消费这些信息,logstash的input 中需要这个topic,不然logstash没有办法取到数据。
  topic: elk-%{[type]}
       
# kafka 的并发运行进程
  worker: 2

#当传输给kafka 有问题的时候,重试的次数;
  max_retries: 3

#单个kafka请求里面的最大事件数,默认2048 
  bulk_max_size: 2048

#等待kafka broker响应的时间,默认30s 
  timeout: 30s

#kafka broker等待请求的最大时长,默认10s 
  broker_timeout: 10s

#每个kafka broker在输出管道中的消息缓存数,默认256 
  channel_buffer_size: 256

#网络连接的保活时间,默认为0,不开启保活机制 
  keep_alive: 60

#输出压缩码,可选项有none, snappy, lz4 and gzip,默认为gzip (kafka支持的压缩,数据会先被压缩,然后被生产者发送,并且在服务端也是保持压缩状态,只有在最终的消费者端才会被解压缩)
  compression: gzip

#允许的最大json消息大小,默认为1000000,超出的会被丢弃,应该小于broker的  message.max.bytes(broker能接收消息的最大字节数)
  max_message_bytes: 1000000

#kafka的响应返回值,0位无等待响应返回,继续发送下一条消息;1表示等待本地提交(leader broker已经成功写入,但follower未写入),-1表示等待所有副本的提交,默认为1 
  required_acks: 0

#客户端ID 用于日志排错,审计等,默认是beats。
  client_id: beats

#测试配置文件:/opt/elk/filebeat/filebeat -c  /opt/elk/filebeat/filebeat.yml test config
#如果配置文件没有问题的话,会出现config ok ,如果有问题会提示具体问题在哪里。

#启动filebeat 
可以先通过 /filebeat -c  -e filebeat.yml  查看一下输入filebeat是否工作正常,会有很多信息打印到屏幕上;
nohup  filebeat -c  filebeat.yml >>/dev/null 2>&1&
复制代码
 


 

logstash

kafka配置详解

input {
#数据来源
  kafka {
   #这个对应filebeat的output 的index
    topics_pattern => "elk-.*"

    #kafka 的配置
    bootstrap_servers => "IP1:9092,IP2:9092,IP3:9092"

    #kafka 中的group ID
    group_id => "logstash-g1"
   }
}
#过滤器,http://grokdebug.herokuapp.com/ 是在线调试logstash filter的工具,你可以在线调试你的过滤规则。

filter {
    grok {
        match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}"}
       
      #因为我们取出了字段,所以不需要原来这个message字段,这个字段里边包含之前beat 输入的所有字段。 
       remove_field => ["message"]
    }
}
output {
  elasticsearch {
    hosts => ["IP:9200"]
    
#这个是在kibana上的index Patterns 的索引,建议什么服务就用干什么名字,因为beat 提供了些kibana的模板可以导入,导入的模板匹配的时候用的索引是对应服务的名称开头 。
    index => "nginx-%{+YYYY.MM.dd}"
    document_type => "nginx"

    #每次20000 发送一次数据到elasticsearch
    flush_size => 20000

    #如果不够20000,没10秒会发送一次数据;、
    idle_flush_time =>10
   }
 }

 

file配置文件详解

input {
 #file可以多次使用,也可以只写一个file而设置它的path属性配置多个文件实现多文件监控
  file {
#type是给结果增加了一个属性叫type值为"<xxx>"的条目。这里的type,对应了ES中index中的type,即如果输入ES时,没有指定type,那么这里的type将作为ES中index的type。
    type => "apache-access" 
    path => "/apphome/ptc/Windchill_10.0/Apache/logs/access_log*"

    #start_position可以设置为beginning或者end,beginning表示从头开始读取文件,end表示读取最新的,这个也要和ignore_older一起使用。
    start_position => beginning
#sincedb_path表示文件读取进度的记录,每行表示一个文件,每行有两个数字,第一个表示文件的inode,第二个表示文件读取到的位置(byteoffset)。默认为$HOME/.sincedb*
    sincedb_path => "/opt/logstash-2.3.1/sincedb_path/access_progress"

    #ignore_older表示了针对多久的文件进行监控,默认一天,单位为秒,可以自己定制,比如默认只读取一天内被修改的文件。
    ignore_older => 604800

    #add_field增加属性。这里使用了${HOSTNAME},即本机的环境变量,如果要使用本机的环境变量,那么需要在启动命令上加--alow-env。
    add_field => {"log_hostname"=>"${HOSTNAME}"}
#这个值默认是\n 换行符,如果设置为空"",那么后果是每个字符代表一个event
    delimiter => ""

    #这个表示关闭超过(默认)3600秒后追踪文件。这个对于multiline来说特别有用。... 这个参数和logstash对文件的读取方式有关,两种方式read tail,如果是read
    close_older => 3600
    coodec => multiline {
      pattern => "^\s"

      #这个negate是否定的意思,意思跟pattern相反,也就是不满足patter的意思。
#      negate => ""

      #what有两个值可选 previous和next,举例说明,java的异常从第二行以空格开始,这里就可以pattern匹配空格开始,what设置为previous意思是空格开头这行跟上一行属于同一event。
    #另一个例子,有时候一条命令太长,当以\结尾时表示这行属于跟下一行属于同一event,这时需要使用negate=>true,what=>'next'。
      what => "previous"

      auto_flush_interval => 60
    }
  }
  file { 
    type => "methodserver-log" 
    path => "/apphome/ptc/Windchill_10.0/Windchill/logs/MethodServer-1604221021-32380.log" 
    start_position => beginning 
    sincedb_path => "/opt/logstash-2.3.1/sincedb_path/methodserver_process"
#    ignore_older => 604800
  }
}
filter{
  #执行ruby程序,下面例子是将日期转化为字符串赋予daytag
  ruby {
    code => "event['daytag'] = event.timestamp.time.localtime.strftime('%Y-%m-%d')"
  }

  # if [path] =~ "access" {} else if [path] =~ "methodserver" {} else if [path] =~ "servermanager" {} else {} 注意语句结构
  if [path] =~ "MethodServer" {             #这里的=~是匹配正则表达式
    grok {
      patterns_dir => ["/opt/logstash-2.3.1/patterns"]       #自定义正则匹配
#      Tue 4/12/16 14:24:17: TP-Processor2: hirecode---->77LS
      match => { "message" => "%{DAY:log_weekday} %{DATE_US:log_date} %{TIME:log_time}: %{GREEDYDATA:log_data}"}
    }
    #mutage是做转换用的
    mutate { 
      replace => { "type" => "apache" }       #替换属性值
      convert => {                 #类型转换
        "bytes" => "integer"         #例如还有float
        "duration" => "integer"
        "state" => "integer"
      }
    #date主要是用来处理文件内容中的日期的。内容中读取的是字符串,通过date将它转换为@timestamp。
   #参考https://www.elastic.co/guide/en/logstash/current/plugins-filters-date.html#plugins-filters-date-match
#    date {
#      match => [ "logTime" , "dd/MMM/yyyy:HH:mm:ss Z" ]
#    }
  }else if [type] in ['tbg_qas','mbg_pre'] { # if ... else if ... else if ... else结构
  }else {
    drop{} # 将event丢弃
  }
}
output {
  stdout{ codec=>rubydebug}                   # 直接输出,调试用起来方便


  # 输出到redis
  redis {
    host => '10.120.20.208'
    data_type => 'list'
    key => '10.99.201.34:access_log_2016-04'
  }
  
  # 输出到ES
  elasticsearch {
    hosts =>"192.168.0.15:9200"
    index => "%{sysid}_%{type}"
    document_type => "%{daytag}"
  }
}