filebeat主要用於收集和轉發日志。filebeat監視指定的日志文件和位置,收集日志事件,並將它們轉發到es或logstash進行索引。
安裝
官網:https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-installation.html
# curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.5.2-x86_64.rpm # sudo rpm -vi filebeat-6.5.2-x86_64.rpm
說明

Filebeat的工作原理:啟動Filebeat時,它會啟動一個或多個inputs,這些inputs將查找指定的log的路徑。對於查找到的每個日志,Filebeat將啟動一個harvester。每個harvester讀取單個日志的新內容,並將新日志數據發送到libbeat,libbeat聚合事件並將聚合數據發送到配置的output。
我們采用的是 filebeat -> kafka ->logstash -> es。
配置文件
filebeat 配置文件比較簡單, 只需要配置一個filebeat.yml
input
#============== Filebeat prospectors =========== filebeat.inputs: # 6.3以前是 filebeat.prospectors: - type: log # input類型,默認為log,6.0以前配置是 - input_type: log paths: - /var/log/java/test-java.log - /var/log/java/*.log - /var/log/*/*.log fields: log_topic: java_log # 附加的可選字段,以向output添加額外的信息。output里面可以使用這個變量 multiline.pattern: '^\[' #多行合並 同logstash的multiline用法相似 multiline.negate: true multiline.match: after - type: log # 一個配置文件里面可以同時收集多個日志 enabled: true paths: - /var/log/nginx/*.log fields: my_log_topic: nginx_log
常用配置
type: 指定input類型,有log、stdin、redis、tcp、syslog等
fields: 可以自定義添加字段,到output中去,后續可以使用這些字段,例如:
fields:
log_topic: mysql_slow
idc: szjf
tail_files: 默認為false。配置為true時,filebeat將從新文件的最后位置開始讀取,而不是從開頭讀取新文件, 注意:如果配合日志輪循使用,新文件的第一行將被跳過。
此選項適用於Filebeat尚未處理的文件。如果先前運行了Filebeat並且文件的狀態已經保留,tail_files則不會應用。
第一次運行Filebeat時,可以使用 tail_files: true 來避免索引舊的日志行。第一次運行后,建議禁用此選項。
registry file
filebeat會將自己處理日志文件的進度信息寫入到registry文件中,以保證filebeat在重啟之后能夠接着處理未處理過的數據,而無需從頭開始。
如果要讓filebeat從頭開始讀文件,需要停止filebeat,然后刪除registry file:
systemctl stop filebeat ;rm -fr /var/lib/filebeat/registry/* ; systemctl start filebaet
registry文件里字段的解釋:
- source: 日志文件的路徑
- offset:已經采集的日志的字節數;已經采集到日志的哪個字節位置
- inode: 日志文件的inode號
- device: 日志所在的磁盤編號
- timestamp: 日志最后一次發生變化的時間戳
- ttl: 采集失效時間,-1表示只要日志存在,就一直采集該日志
multiline: https://www.elastic.co/guide/en/beats/filebeat/current/multiline-examples.html#multiline 處理多行合並
output
配置輸出的位置,比如kafka,logstash,es,redis,file 等
#================================ Outputs ===================================== #-------------------------Kafka output ------------------------------ output.kafka: hosts: ["kafka01:9092","kafka02:9092","kafka03:9092] topic: '%{[fields.my_log_topic]}' partition.round_robin: reachable_only: false version: 0.10.0.0 required_acks: 1 compression: none max_message_bytes: 1000000 #output.logstash: # hosts: ["localhost:5044"]
還可以有一些其他配置,比如processor處理器配置(不是必需的)
#====================Preocessors===================== processors: - drop_fields: #刪除字段,不再kibana里面展示,默認情況kibana里面會自動展示這些beat字段 fields: ["beat.hostname","beat.version","beat.name","prospector.type","input.type"] #也可以在logstash里面通過remove_field 刪除字段 #mutate{ # remove_field => ["[beat][hostname]","[beat][version]","input","prospector"] # }
配置完filebeat.yml,啟動filebeat 即可。# /etc/init.d/filebeat start
使用filebeat遇到的問題

手動在kafka創建topic后,再重新啟動filebeat, 問題解決。
./bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 6 --topic nginx_log
經檢查發現是因為kafka配置文件里面配置了 auto.create.topics.enable = false。auto.create.topics.enable 參數可以用來配置Kafka Server是否自動創建topic。
