1 原理
Filebeat包含兩個主要組件:inputs和harvesters。這些組件一起工作以尾部文件並將事件數據發送到您指定的輸出。
1】Harvester
harvester負責讀取單個文件的內容。harvester逐行讀取每個文件,然後將內容發送到輸出。每個文件啓動一個harvester。harvester負責打開和關閉文件,這意味着在harvester運行時文件描述符保持打開狀態。如果在收集文件時將其刪除或重命名,Filebeat將繼續讀取該文件。這樣做的副作用是磁盤上的空間將保留,直到harvester關閉爲止。默認情況下,Filebeat保持文件打開直到close_inactive到達。
關閉harvester有以下後果:
- 關閉文件處理程序,如果在harvester仍在讀取文件時刪除了文件,則釋放了基礎資源。
- 只有在scan_frequency經過之後,纔會再次開始文件的收集。
- 如果在harvester關閉時移動或刪除文件,則文件的收割將不會繼續。
2】Input
input負責管理harvester並查找所有可讀取的資源。
如果輸入類型爲log,則輸入將在驅動器上找到與定義的全局路徑匹配的所有文件,併爲每個文件啓動收集器。每個輸入都在其自己的Go例程中運行。
3】Filebeat如何保持文件狀態
Filebeat保留每個文件的狀態,並經常將狀態刷新到註冊表文件中的磁盤。該狀態用於記住harvester正在讀取的最後一個偏移量,並確保發送所有日誌行。如果無法到達輸出(例如Elasticsearch或Logstash),則Filebeat會跟蹤發送的最後幾行,並在輸出再次變爲可用時繼續讀取文件。在Filebeat運行時,狀態信息也保存在內存中,用於每個輸入。重新啓動Filebeat時,將使用註冊表文件中的數據來重建狀態,並且Filebeat會在最後一個已知位置繼續每個harvester。
對於每個輸入,Filebeat會保留找到的每個文件的狀態。由於可以重命名或移動文件,因此文件名和路徑不足以標識文件。對於每個文件,Filebeat都存儲唯一的標識符以檢測文件是否以前被收穫過。
4】Filebeat如何確保至少一次交付
Filebeat保證事件將至少一次傳遞到配置的輸出,並且不會丟失數據。Filebeat之所以能夠實現此行爲,是因爲它在註冊表文件中存儲了每個事件的傳遞狀態。
在定義的輸出被阻止並且尚未確認所有事件的情況下,Filebeat將繼續嘗試發送事件,直到輸出確認已接收到事件爲止。
如果Filebeat在發送事件的過程中關閉,則它不會在關閉之前等待輸出確認所有事件。重新啓動Filebeat時,將再次發送發送到輸出但在Filebeat關閉之前未確認的所有事件。這樣可以確保每個事件至少發送一次,但是最終可能會將重複的事件發送到輸出。
2 Inputs
每個輸入都以破折號"-"
開頭,可以指定多個輸入,並且可以多次指定相同的輸入類型。
2.1 Log input
1】enabled
啓用和禁用輸入。默認爲true。
2】paths
日誌文件絕對路徑
filebeat.inputs:
- type: log
paths:
- /var/log/system.log
- /var/log/wifi.log
- /var/log/*/*.log # 從/var/log的子文件夾中提取所有.log文件
3】tags
filebeat.inputs:
- type: log
. . .
tags: ["json"]
4】fields
指定可選字段以將其他信息添加到輸出中。
fields_under_root選項設置爲true,則自定義字段將作爲頂級字段存儲在輸出文檔中,而不是分組在fields子詞典下。
filebeat.inputs:
- type: log
...
fields:
apache: true
fields_under_root: true
5】exclude_lines
匹配Filebeat排除的行
filebeat.inputs:
- type: log
...
exclude_lines: ['^DBG']
6】include_lines
匹配Filebeat包括的行
filebeat.inputs:
- type: log
...
include_lines: ['^ERR', '^WARN']
如果同時定義了include_lines和exclude_lines,則Filebeat首先執行include_lines,然後執行exclude_lines。
filebeat.inputs:
- type: log
...
include_lines: ['sometext']
exclude_lines: ['^DBG']
7】harvester_buffer_size
每個harvester在獲取文件時使用的緩衝區大小(以字節爲單位),默認值爲16384。
8】max_bytes
一條日誌消息可以具有的最大字節數。默認值爲10MB(10485760)。
9】multiline
控制Filebeat如何處理跨多行的日誌消息的選項。
非[開頭的行與上一行合併。
filebeat.inputs:
- type: log
...
multiline.pattern: '^\['
multiline.negate: true
multiline.match: after
非“[2015-08-24”格式開頭的行,合併到上一行。
filebeat.inputs:
- type: log
...
multiline.pattern: '^\[[0-9]{4}-[0-9]{2}-[0-9]{2}'
multiline.negate: true
multiline.match: after
3 Output
3.1 Logstash
編輯Filebeat配置文件以通過註釋掉它來禁用Elasticsearch輸出,並通過取消註釋logstash部分來啓用Logstash輸出。
output.logstash:
hosts: ["localhost:5044", "localhost:5045"]
loadbalance: true
1】worker
每個配置的主機向Logstash發佈事件的工作程序數。
3.2 Elasticsearch
output.elasticsearch:
hosts: ["http://192.160.1.31:9200","http://192.160.1.32:9200"]
index: "elk-es-%{+yyyy.MM.dd}"
setup.template.name: "elk-es"
setup.template.pattern: "elk-es-*"
setup.template.settings:
index.number_of_shards: 1
index.number_of_replicas: 1
setup.ilm.enabled: false
1】setup.template.enabled
設置爲false可禁用模板加載。
2】setup.template.name
模板的名稱,默認值爲filebeat。
3】setup.template.pattern
適用於默認索引設置的模板模式。
4】setup.template.fields
描述字段的YAML文件的路徑,默認值爲fields.yml
5】setup.template.overwrite
是否覆蓋現有模板,默認爲false。
6】setup.template.settings
要放入elasticsearch模板字典中的設置字典。
7】setup.ilm.enabled
3.3 Kafka
output.kafka:
hosts: ["kafka1:9092", "kafka2:9092", "kafka3:9092"]
topic: '%{[fields.log_topic]}'
partition.round_robin:
reachable_only: false
required_acks: 1
compression: gzip
max_message_bytes: 1000000
output.kafka:
hosts: ["localhost:9092"]
topic: "logs-%{[beat.version]}"
topics:
- topic: "critical-%{[beat.version]}"
when.contains:
message: "CRITICAL"
- topic: "error-%{[beat.version]}"
when.contains:
message: "ERR"