續 • 《開始使用Filebeat》
1. 關於Filebeat
當你要面對成百上千、甚至成千上萬的服務器、虛擬機和容器生成的日志時,請告別 SSH 吧!Filebeat 將為你提供一種輕量型方法,用於轉發和匯總日志與文件,讓簡單的事情不再繁雜。
關於Filebeat,記住兩點:
- 輕量級日志采集器
- 輸送至 Elasticsearch 或 Logstash,在 Kibana 中實現可視化
2. Filebeat是如何工作的
Filebeat由兩個主要組件組成:inputs 和 harvesters (直譯:收割機,采集器)。這些組件一起工作以跟蹤文件,並將事件數據發送到你指定的輸出。
2.1. harvester是什么
一個harvester負責讀取一個單個文件的內容。
harvester逐行讀取每個文件(一行一行地讀取每個文件),並把這些內容發送到輸出。
每個文件啟動一個harvester。
harvester負責打開和關閉這個文件,這就意味着在harvester運行時文件描述符保持打開狀態。
在harvester正在讀取文件內容的時候,文件被刪除或者重命名了,那么Filebeat會續讀這個文件。這就有一個問題了,就是只要負責這個文件的harvester沒用關閉,那么磁盤空間就不會釋放。默認情況下,Filebeat保存文件打開直到close_inactive到達。
2.2. input是什么
一個input負責管理harvesters,並找到所有要讀取的源。
如果input類型是log,則input查找驅動器上與已定義的glob路徑匹配的所有文件,並為每個文件啟動一個harvester。
每個input都在自己的Go例程中運行。
下面的例子配置Filebeat從所有匹配指定的glob模式的文件中讀取行:
filebeat.inputs: - type: log paths: - /var/log/*.log - /var/path2/*.log
2.3. Filebeat如何保持文件狀態
Filebeat保存每個文件的狀態,並經常刷新狀態到磁盤上的注冊文件(registry)。狀態用於記住harvester讀取的最后一個偏移量,並確保所有日志行被發送(到輸出)。如果輸出,比如Elasticsearch 或者 Logstash等,無法訪問,那么Filebeat會跟蹤已經發送的最后一行,並只要輸出再次變得可用時繼續讀取文件。當Filebeat運行時,會將每個文件的狀態新保存在內存中。當Filebeat重新啟動時,將使用注冊文件中的數據重新構建狀態,Filebeat將在最后一個已知位置繼續每個harvester。
對於每個輸入,Filebeat保存它找到的每個文件的狀態。因為文件可以重命名或移動,所以文件名和路徑不足以標識文件。對於每個文件,Filebeat存儲惟一標識符,以檢測文件是否以前讀取過。
如果你的情況涉及每天創建大量的新文件,你可能會發現注冊表文件變得太大了。
(畫外音:Filebeat保存每個文件的狀態,並將狀態保存到registry_file中的磁盤。當重新啟動Filebeat時,文件狀態用於在以前的位置繼續讀取文件。如果每天生成大量新文件,注冊表文件可能會變得太大。為了減小注冊表文件的大小,有兩個配置選項可用:clean_remove和clean_inactive。對於你不再訪問且被忽略的舊文件,建議您使用clean_inactive。如果想從磁盤上刪除舊文件,那么使用clean_remove選項。)
2.4. Filebeat如何確保至少投遞一次(at-least-once)?
Filebeat保證事件將被投遞到配置的輸出中至少一次,並且不會丟失數據。Filebeat能夠實現這種行為,因為它將每個事件的投遞狀態存儲在注冊表文件中。
在定義的輸出被阻塞且沒有確認所有事件的情況下,Filebeat將繼續嘗試發送事件,直到輸出確認收到事件為止。
如果Filebeat在發送事件的過程中關閉了,則在關閉之前它不會等待輸出確認所有事件。當Filebeat重新啟動時,發送到輸出(但在Filebeat關閉前未確認)的任何事件將再次發送。這確保每個事件至少被發送一次,但是你最終可能會將重復的事件發送到輸出。你可以通過設置shutdown_timeout選項,將Filebeat配置為在關閉之前等待特定的時間。
3. 模塊
Filebeat模塊簡化了公共日志格式的收集、解析和可視化。
一個典型的模塊(例如,對於Nginx日志)是由一個或多個fileset組成的(以Nginx為例,access 和 error)。
一個fileset包含以下內容:
- Filebeat 輸入配置,其中包含要默認的查找或者日志文件路徑。這些默認路徑取決於操作系統。Filebeat配置還負責在需要的時候拼接多行事件。
- Elasticsearch Ingest Node 管道定義,用於解析日志行。
- 字段定義,用於為每個字段在Elasticsearch中配置正確類型。它們還包含每個字段的簡短描述。
- 簡單的Kibana dashboards,用於可視化日志文件。
Filebeat會根據你的環境自動調整這些配置,並將它們加載到相應的 Elastic stack 組件中。
3.1. 常用日志格式的模塊
Filebeat提供了一組預先構建的模塊,你可以使用這些模塊快速實現並部署一個日志監控解決方案,包括樣例指示板和數據可視化,完成這些大約只需要5分鍾。
這些模塊支持常見的日志格式,如Nginx、Apache2和MySQL,可以通過一個簡單的命令來運行。
3.1.1. 先決條件
在運行Filebeat模塊之前:
- 安裝並配置Elastic stack
- 完成Filebeat的安裝
- 安裝 Ingest Node GeoIP 和 User Agent 插件。這些插件用來捕獲地理位置和瀏覽器信息,以供可視化組件所用
- 檢查Elasticsearch和Kibana是否正在運行,以及Elasticsearch是否准備好從Filebeat那里接收數據
你可以在Elasticsearch主目錄下運行下列命令來安裝這些插件:
sudo bin/elasticsearch-plugin install ingest-geoip sudo bin/elasticsearch-plugin install ingest-user-agent
然后,重啟Elasticsearch
3.1.2. 運行Filebeat模塊:
第1步:在filebeat.yml配置文件中設置Elasticsearch安裝的位置。默認情況下,Filebeat假設Elasticsearch運行在9200端口上。
如果你是運行在Elastic Cloud上,指定你的Cloud ID。例如:
cloud.id: "staging:dXMtZWFzdC0xLmlOTYyNTc0Mw=="
如果你是運行在自己的硬件設備上,設置主機和端口。例如:
output.elasticsearch: hosts: ["myEShost:9200"]
第2步:如果Elasticsearch配置了安全策略,你需要在filebeat.yml中指定訪問的憑證。
如果你運行在Elastic Cloud上,請指定你的授權憑證。例如:
cloud.auth: "elastic:YOUR_PASSWORD"
如果你運行在自己的硬件設備上,請指定你的Elasticsearch和Kibana憑證。例如:
output.elasticsearch: hosts: ["myEShost:9200"] username: "filebeat_internal" password: "YOUR_PASSWORD" setup.kibana: host: "mykibanahost:5601" username: "my_kibana_user" password: "YOUR_PASSWORD"
第3步:啟用你想運行的模塊。例如:
./filebeat modules enable system nginx mysql
第4步:設置初始環境:
./filebeat setup -e
第5步:運行Filebeat
./filebeat -e
第6步:在Kibana中查看你的數據
3.1.3. 設置路徑變量
每個模塊和fileset都有變量,你可以設置它們,以改變模塊的默認行為,包括模塊查找日志文件的路徑。
可以在配置文件或者命令行下設置這些路徑。例如:
- module: nginx access: var.paths: ["/var/log/nginx/access.log*"]
或者
./filebeat -e -M "nginx.access.var.paths=[/usr/local/var/log/nginx/access.log*]"
3.2. Nginx模塊
nginx模塊解析Nginx創建的access和error日志
當你運行模塊的時候,它在底層執行一些任務:
- 設置默認的日志文件路徑
- 確保將每個多行日志事件作為單個事件發送
- 使用ingest節點解析和處理日志行,將數據塑造成適合在Kibana中可視化的結構
- 部署顯示日志數據的dashboards
這個模塊需要 ingest-user-agent 和 ingest-geoip 兩個Elasticsearch插件
3.2.1. 設置並運行模塊
第1步:啟用模塊
./filebeat modules enable nginx
為了查看啟用或者禁用的模塊列表,運行:
./filebeat modules list
第2步:設置初始環境
./filebeat setup -e
第3步:運行
./filebeat -e
3.2.2. 配置模塊
通過在modules.d/nginx.yml中指定變量設置,或者在命令行中重寫設置來改變模塊的行為。例如:
- module: nginx access: enabled: true var.paths: ["/path/to/log/nginx/access.log*"] error: enabled: true var.paths: ["/path/to/log/nginx/error.log*"]
或者
-M "nginx.access.var.paths=[/path/to/log/nginx/access.log*]" -M "nginx.error.var.paths=[/path/to/log/nginx/error.log*]"
3.3. Kafka模塊
3.3.1. 配置
- module: kafka log: enabled: true var.paths: - "/path/to/logs/controller.log*" - "/path/to/logs/server.log*" - "/path/to/logs/state-change.log*" - "/path/to/logs/kafka-*.log*"
或者
-M "kafka.log.var.paths=[/path/to/logs/controller.log*, /path/to/logs/server.log*, /path/to/logs/state-change.log*, /path/to/logs/kafka-*.log*]"
其它模塊配置大同小異,不再贅述,更多請參考 https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-modules.html
4. 配置Filebeat
為了配置Filebeat,你可以編輯配置文件 filebeat.yml。還有一個完整的配置文件示例 filebeat.reference.yml
4.1. 指定運行哪個模塊
Filebeat提供了幾種啟用模塊的不同方式:
- 用modules.d目錄下的配置啟用模塊
- 運行Filebeat的時候啟用模塊
- 用filebeat.yml啟用模塊配置
4.1.1. 用modules.d目錄啟用模塊配置
./filebeat modules enable apache2 mysql
4.1.2. 運行Filebeat是啟用模塊
./filebeat --modules nginx,mysql,system
4.1.3. 在filebeat.yml中啟用模塊
如果可能的話,你應該用modules.d目錄下的配置文件
filebeat.modules: - module: nginx - module: mysql - module: system
4.2. 配置inputs
為了手動配置Filebeat(代替用模塊),你可以在filebeat.yml中的filebeat.inputs區域下指定一個inputs列表。
列表時一個YMAL數組,並且你可以指定多個inputs,相同input類型也可以指定多個。例如:
filebeat.inputs: - type: log paths: - /var/log/system.log - /var/log/wifi.log - type: log paths: - "/var/log/apache2/*" fields: apache: true fields_under_root: true
4.2.1. Log input
從日志文件讀取行
為了配置這種input,需要指定一個paths列表,列表中的每一項必須能夠定位並抓取到日志行。例如:
filebeat.inputs: - type: log paths: - /var/log/messages - /var/log/*.log
你還可以應用設置其它額外的配置項(比如,fields, include_lines, exclude_lines, multiline等等)來從這些文件中讀取行。你設置的這些配置對所有這種類型的input在獲取日志行的時候都生效。
為了對不同的文件應用不同的配置,你需要定義多個input區域:
filebeat.inputs: - type: log # 從system.log和wifi.log中讀取日志行 paths: - /var/log/system.log - /var/log/wifi.log - type: log # 從apache2目錄下的每一個文件中讀取日志行,並且在輸出的時候會加上額外的字段apache paths: - "/var/log/apache2/*" fields: apache: true fields_under_root: true
配置項
paths
例如:/var/log/*/*.log 將會抓取/var/log子目錄目錄下所有.log文件。它不會從/var/log本身目錄下的日志文件。如果你應用recursive_glob設置的話,它將遞歸地抓取所有子目錄下的所有.log文件。
recursive_glob.enabled
允許將**擴展為遞歸glob模式。啟用這個特性后,每個路徑中最右邊的**被擴展為固定數量的glob模式。例如:/foo/**擴展到/foo, /foo/*, /foo/**,等等。如果啟用,它將單個**擴展為8級深度*模式。這個特性默認是啟用的,設置recursive_glob.enabled為false可以禁用它。
encoding
讀取的文件的編碼
下面是一些W3C推薦的簡單的編碼:
- plain, latin1, utf-8, utf-16be-bom, utf-16be, utf-16le, big5, gb18030, gbk, hz-gb-2312
- euc-kr, euc-jp, iso-2022-jp, shift-jis, 等等
plain編碼是特殊的,因為它不校驗或者轉換任何輸入。
exclude_lines
一組正則表達式,用於匹配你想要排除的行。Filebeat會刪除(PS:我覺得用“丟棄”更合適)這組正則表達式匹配的行。默認情況下,沒有行被刪除。空行被忽略。
如果指定了multiline,那么在用exclude_lines過濾之前會將每個多行消息合並成一個單行。(PS:也就是說,多行合並成單行后再支持排除行的過濾)
下面的例子配置Filebeat刪除以DBG開頭的行:
filebeat.inputs: - type: log ... exclude_lines: ['^DBG']
include_lines
一組正則表達式,用於匹配你想要包含的行。Filebeat只會導出那些匹配這組正則表達式的行。默認情況下,所有的行都會被導出。空行被忽略。
如果指定了multipline設置,每個多行消息先被合並成單行以后再執行include_lines過濾。
下面是一個例子,配置Filebeat導出以ERR或者WARN開頭的行:
filebeat.inputs: - type: log ... include_lines: ['^ERR', '^WARN']
(畫外音:如果 include_lines 和 exclude_lines 都被定義了,那么Filebeat先執行 include_lines 后執行 exclude_lines,而與這兩個選項被定義的順序沒有關系。include_lines 總是在 exclude_lines選項前面執行,即使在配置文件中 exclude_lines 出現在 include_lines的前面。)
下面的例子導出那些除了以DGB開頭的所有包含sometext的行:
filebeat.inputs: - type: log ... include_lines: ['sometext'] exclude_lines: ['^DBG']
harvester_buffer_size
當抓取一個文件時每個harvester使用的buffer的字節數。默認是16384。
max_bytes
單個日志消息允許的最大字節數。超過max_bytes的字節將被丟棄且不會被發送。對於多行日志消息來說這個設置是很有用的,因為它們往往很大。默認是10MB(10485760)。
json
這些選項使得Filebeat將日志作為JSON消息來解析。例如:
json.keys_under_root: true json.add_error_key: true json.message_key: log
為了啟用JSON解析模式,你必須至少指定下列設置項中的一個:
keys_under_root
默認情況下,解碼后的JSON被放置在一個以"json"為key的輸出文檔中。如果你啟用這個設置,那么這個key在文檔中被復制為頂級。默認是false。
overwrite_keys
如果keys_under_root被啟用,那么在key沖突的情況下,解碼后的JSON對象將覆蓋Filebeat正常的字段
add_error_key
如果啟用,則當JSON反編排出現錯誤的時候Filebeat添加 "error.message" 和 "error.type: json"兩個key,或者當沒有使用message_key的時候。
message_key
一個可選的配置,用於在應用行過濾和多行設置的時候指定一個JSON key。指定的這個key必須在JSON對象中是頂級的,而且其關聯的值必須是一個字符串,否則沒有過濾或者多行聚集發送。
ignore_decoding_error
一個可選的配置,用於指定是否JSON解碼錯誤應該被記錄到日志中。如果設為true,錯誤將被記錄。默認是false。
multiline
用於控制Filebeat如何擴多行處理日志消息
exclude_files
一組正則表達式,用於匹配你想要忽略的文件。默認沒有文件被排除。
下面是一個例子,忽略.gz的文件
filebeat.inputs: - type: log ... exclude_files: ['\.gz$']
ignore_older
如果啟用,那么Filebeat會忽略在指定的時間跨度之前被修改的文件。如果你想要保留日志文件一個較長的時間,那么配置ignore_older是很有用的。例如,如果你想要開始Filebeat,但是你只想發送最近一周最新的文件,這個情況下你可以配置這個選項。
你可以用時間字符串,比如2h(2小時),5m(5分鍾)。默認是0,意思是禁用這個設置。
你必須設置ignore_older比close_inactive更大。
close_*
close_*配置項用於在一個確定的條件或者時間點之后關閉harvester。關閉harvester意味着關閉文件處理器。如果在harvester關閉以后文件被更新,那么在scan_frequency結束后改文件將再次被拾起。然而,當harvester關閉的時候如果文件被刪除或者被移動,那么Filebeat將不會被再次拾起,並且這個harvester還沒有讀取的數據將會丟失。
close_inactive
當啟用此選項時,如果文件在指定的持續時間內未被獲取,則Filebeat將關閉文件句柄。當harvester讀取最后一行日志時,指定周期的計數器就開始工作了。它不基於文件的修改時間。如果關閉的文件再次更改,則會啟動一個新的harvester,並且在scan_frequency結束后,將獲得最新的更改。
推薦給close_inactive設置一個比你的日志文件更新的頻率更大一點兒的值。例如,如果你的日志文件每隔幾秒就會更新,你可以設置close_inactive為1m。如果日志文件的更新速率不固定,那么可以用多個配置。
將close_inactive設置為更低的值意味着文件句柄可以更早關閉。然而,這樣做的副作用是,如果harvester關閉了,新的日志行不會實時發送。
關閉文件的時間戳不依賴於文件的修改時間。代替的,Filebeat用一個內部時間戳來反映最后一次讀取文件的時間。例如,如果close_inactive被設置為5分鍾,那么在harvester讀取文件的最后一行以后,這個5分鍾的倒計時就開始了。
你可以用時間字符串,比如2h(2小時),5m(5分鍾)。默認是5m。
close_renamed
當啟用此選項時,Filebeat會在重命名文件時關閉文件處理器。默認情況下,harvester保持打開狀態並繼續讀取文件,因為文件處理器不依賴於文件名。如果啟用了close_rename選項,並且重命名或者移動的文件不再匹配文件模式的話,那么文件將不會再次被選中。Filebeat將無法完成文件的讀取。
close_removed
當啟用此選項時,Filebeat會在刪除文件時關閉harvester。通常,一個文件只有在它在由close_inactive指定的期間內不活躍的情況下才會被刪除。但是,如果一個文件被提前刪除,並且你不啟用close_removed,則Filebeat將保持文件打開,以確保harvester已經完成。如果由於文件過早地從磁盤中刪除而導致文件不能完全讀取,請禁用此選項。
close_timeout
當啟用此選項是,Filebeat會給每個harvester一個預定義的生命時間。無論讀到文件的什么位置,只要close_timeout周期到了以后就會停止讀取。當你想要在文件上只花費預定義的時間時,這個選項對舊的日志文件很有用。盡管在close_timeout時間以后文件就關閉了,但如果文件仍然在更新,則Filebeat將根據已定義的scan_frequency再次啟動一個新的harvester。這個harvester的close_timeout將再次啟動,為超時倒計時。
scan_frequency
Filebeat多久檢查一次指定路徑下的新文件(PS:檢查的頻率)。例如,如果你指定的路徑是 /var/log/* ,那么會以指定的scan_frequency頻率去掃描目錄下的文件(PS:周期性掃描)。指定1秒鍾掃描一次目錄,這還不是很頻繁。不建議設置為小於1秒。
如果你需要近實時的發送日志行的話,不要設置scan_frequency為一個很低的值,而應該調整close_inactive以至於文件處理器保持打開狀態,並不斷地輪詢你的文件。
默認是10秒。
scan.sort
如果你指定了一個非空的值,那么你可以決定用scan.order的升序或者降序。可能的值是 modtime 和 filename。為了按文件修改時間排序,用modtime,否則用 filename。默認此選項是禁用的。
scan.order
可能的值是 asc 或者 desc。默認是asc。
更多配置請查看 https://www.elastic.co/guide/en/beats/filebeat/current/configuration-filebeat-options.html
(畫外音:
這里再重點說一下 ignore_older , close_inactive , scan_frequency 這三個配置項
- ignore_older: 它是設置一個時間范圍(跨度),不在這個跨度范圍之內的文件更新都不管
- scan_frequency: 它設置的是掃描文件的頻率,看看文件是否更新
- close_inactive:它設置的是文件如果多久沒更新的話就關閉文件句柄,它是有一個倒計時,如果在倒計時期間,文件沒有任何變化,則當倒計時結束的時候關閉文件句柄。不建議設置為小於1秒。
如果文件句柄關了以后,文件又被更新,那么在下一個掃描周期結束的時候變化發現這個改變,於是會再次打開這個文件讀取日志行,前面我們也提到過,每個文件上一次讀到什么位置(偏移量)都記錄在registry文件中。
)
4.3. 管理多行消息
Filebeat獲取的文件可能包含跨多行文本的消息。例如,多行消息在包含Java堆棧跟蹤的文件中很常見。為了正確處理這些多行事件,你需要在filebeat.yml中配置multiline以指定哪一行是單個事件的一部分。
4.3.1. 配置項
你可以在filebeat.yml的filebeat.inputs區域指定怎樣處理跨多行的消息。例如:
multiline.pattern: '^\[' multiline.negate: true multiline.match: after
上面的例子中,Filebeat將所有不以 [ 開始的行與之前的行進行合並。
multiline.pattern
指定用於匹配多行的正則表達式
multiline.negate
定義模式是否被否定。默認false。
multiline.match
指定Filebeat如何把多行合並成一個事件。可選的值是 after 或者 before。
這種行為還收到negate的影響:
multiline.flush_pattern
指定一個正則表達式,多行將從內存刷新到磁盤。
multiline.max_lines
可以合並成一個事件的最大行數。如果一個多行消息包含的行數超過max_lines,則超過的行被丟棄。默認是500。
4.4. 多行配置示例
4.4.1. Java堆棧跟蹤
Java堆棧跟蹤由多行組成,在初始行之后的每一行都以空格開頭,例如下面這樣:
Exception in thread "main" java.lang.NullPointerException at com.example.myproject.Book.getTitle(Book.java:16) at com.example.myproject.Author.getBookTitles(Author.java:25) at com.example.myproject.Bootstrap.main(Bootstrap.java:14)
為了把這些行合並成單個事件,用寫了多行配置:
multiline.pattern: '^[[:space:]]' multiline.negate: false multiline.match: after
這個配置將任意以空格開始的行合並到前一行
下面是一個稍微更復雜的例子
Exception in thread "main" java.lang.IllegalStateException: A book has a null property at com.example.myproject.Author.getBookIds(Author.java:38) at com.example.myproject.Bootstrap.main(Bootstrap.java:14) Caused by: java.lang.NullPointerException at com.example.myproject.Book.getId(Book.java:22) at com.example.myproject.Author.getBookIds(Author.java:35) ... 1 more
為了合並這個,用下面的配置:
multiline.pattern: '^[[:space:]]+(at|\.{3})\b|^Caused by:' multiline.negate: false multiline.match: after
在這個例子中,模式匹配下列行:
- 以空格開頭,后面跟 at 或者 ... 的行
- 以 Caused by: 開頭的行
一些編程語言使用行尾的反斜杠(\)字符表示該行繼續,如本例所示:
printf ("%10.10ld \t %10.10ld \t %s\ %f", w, x, y, z );
為了把這樣的多行合並成單個事件,用下列配置:
multiline.pattern: '\\$' multiline.negate: false multiline.match: before
這段配置合並任意以 \ 結尾的行
4.4.2. 時間戳
下面是以時間戳開始的日志
[2015-08-24 11:49:14,389][INFO ][env ] [Letha] using [1] data paths, mounts [[/ (/dev/disk1)]], net usable_space [34.5gb], net total_space [118.9gb], types [hfs]
為了合並這種行,用下列配置:
multiline.pattern: '^\[[0-9]{4}-[0-9]{2}-[0-9]{2}' multiline.negate: true multiline.match: after
4.4.3. 應用事件
有時你的應用日志包含事件,自定義的開始和結束時間,例如:
[2015-08-24 11:49:14,389] Start new event [2015-08-24 11:49:14,395] Content of processing something [2015-08-24 11:49:14,399] End event
為了合並這種行,用下面的多行配置:
multiline.pattern: 'Start new event' multiline.negate: true multiline.match: after multiline.flush_pattern: 'End event'
4.5. 加載外部配置文件
Filebeat允許將配置分隔為多個較小的配置文件,然后加載外部配置文件。
4.5.1. 輸入配置
filebeat.config.inputs: enabled: true path: configs/*.yml
每一個在path下的文件都必須包含一個或多個input定義,例如:
- type: log paths: - /var/log/mysql.log scan_frequency: 10s - type: log paths: - /var/log/apache.log scan_frequency: 5s
4.5.2. 模塊配置
filebeat.config.modules: enabled: true path: ${path.config}/modules.d/*.yml
每個被發現的配置文件必須包含一個或多個模塊定義,例如:
- module: apache2 access: enabled: true var.paths: [/var/log/apache2/access.log*] error: enabled: true var.paths: [/var/log/apache2/error.log*]
4.6. 配置output
4.6.1. 配置Elasticsearch output
當你指定Elasticsearch作為output時,Filebeat通過Elasticsearch提供的HTTP API向其發送數據。例如:
output.elasticsearch: hosts: ["https://localhost:9200"] index: "filebeat-%{[beat.version]}-%{+yyyy.MM.dd}" ssl.certificate_authorities: ["/etc/pki/root/ca.pem"] ssl.certificate: "/etc/pki/client/cert.pem" ssl.key: "/etc/pki/client/cert.key"
為了啟用SSL,只需要在hosts下的所有URL添加https即可
output.elasticsearch: hosts: ["https://localhost:9200"] username: "filebeat_internal" password: "YOUR_PASSWORD"
如果Elasticsearch節點是用IP:PORT的形式定義的,那么添加protocol:https。
output.elasticsearch: hosts: ["localhost"] protocol: "https" username: "{beatname_lc}_internal" password: "{pwd}"
配置項
enabled
啟用或禁用該輸出。默認true。
hosts
Elasticsearch節點列表。事件以循環順序發送到這些節點。如果一個節點變得不可訪問,那么自動發送到下一個節點。每個節點可以是URL形式,也可以是IP:PORT形式。如果端口沒有指定,用9200。
output.elasticsearch: hosts: ["10.45.3.2:9220", "10.45.3.1:9230"] protocol: https path: /elasticsearch
username
用於認證的用戶名
password
用戶認證的密碼
protocol
可選值是:http 或者 https。默認是http。
path
HTTP API調用前的HTTP路徑前綴。這對於Elasticsearch監聽HTTP反向代理的情況很有用。
headers
將自定義HTTP頭添加到Elasticsearch輸出的每個請求。
index
索引名字。(PS:意思是要發到哪個索引中去)。默認是"filebeat-%{[beat.version]}-%{+yyyy.MM.dd}"(例如,"filebeat-6.3.2-2017.04.26")。如果你想改變這個設置,你需要配置 setup.template.name 和 setup.template.pattern 選項。如果你用內置的Kibana dashboards,你也需要設置setup.dashboards.index選項。
indices
索引選擇器規則數組,支持條件、基於格式字符串的字段訪問和名稱映射。如果索引缺失或沒有匹配規則,將使用index字段。例如:
output.elasticsearch: hosts: ["http://localhost:9200"] index: "logs-%{[beat.version]}-%{+yyyy.MM.dd}" indices: - index: "critical-%{[beat.version]}-%{+yyyy.MM.dd}" when.contains: message: "CRITICAL" - index: "error-%{[beat.version]}-%{+yyyy.MM.dd}" when.contains: message: "ERR"
timeout
請求超時時間。默認90秒。
4.6.2. 配置Logstash output
output.logstash: hosts: ["127.0.0.1:5044"]
上面是配置Filebeat輸出到Logstash,那么Logstash本身也有配置,例如:
input { beats { port => 5044 } } output { elasticsearch { hosts => ["http://localhost:9200"] index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" } }
4.6.3. 配置Kafka output
output.kafka: # initial brokers for reading cluster metadata hosts: ["kafka1:9092", "kafka2:9092", "kafka3:9092"] # message topic selection + partitioning topic: '%{[fields.log_topic]}' partition.round_robin: reachable_only: false required_acks: 1 compression: gzip max_message_bytes: 1000000
4.7. 負載均衡
為了啟用負載均衡,當你配置輸出的時候你需要指定 loadbalance: true
output.logstash: hosts: ["localhost:5044", "localhost:5045"] loadbalance: true
4.8. 加載索引模板
在filebeat.yml配置文件的setup.template區域指定索引模板,用來設置在Elasticsearch中的映射。如果模板加載是啟用的(默認的),Filebeat在成功連接到Elasticsearch后自動加載索引模板。
你可以調整下列設置或者覆蓋一個已經存在的模板。
setup.template.enabled
設為false表示禁用模板加載
setup.template.name
模板的名字。默認是filebeat。Filebeat的版本總是跟在名字后面,所以最終的名字是 filebeat-%{[beat.version]}
setup.template.pattern
模板的模式。默認模式是filebeat-*。例如:
setup.template.name: "filebeat" setup.template.pattern: "filebeat-*"
setup.template.fields
描述字段的YAML文件路徑。默認是 fields.yml。
setup.template.overwrite
是否覆蓋存在的模板。默認false。
setup.template.settings._source
setup.template.name: "filebeat" setup.template.fields: "fields.yml" setup.template.overwrite: false setup.template.settings: _source.enabled: false
4.9. 監控Filebeat
X-Pack監控使得可以很容易從Kibana監控Filebeat。
為了配置Filebeat收集並發送監控信息,
第1步:創建一個具有適當權限向Elasticsearch發送系統級監視數據的用戶。
第2步:在Filebeat配置文件中添加xpack.monitoring設置。如果你配置了Elasticsearch輸出,指定下面最小的配置:
xpack.monitoring.enabled: true
如果你配置的是其它輸出,比如Logstash,那么你必須指定一些額外的配置項。例如:
xpack.monitoring: enabled: true elasticsearch: hosts: ["https://example.com:9200", "https://example2.com:9200"] username: beats_system password: beatspassword
(注意:目前,你必須將監視數據發送到與所有其他事件相同的集群。如果你配置了Elasticsearch輸出,請不要在監視配置中指定其他主機。)
第3步:在Kibana中配置監控
第4步:在Kibana中查看監控
5. FAQ
5.1. Too many open file handler?(太多打開的文件句柄)
Filebeat保持文件處理器打開,以防它到達文件的末尾,以便它可以實時讀取新的日志行。如果Filebeat正在收集大量文件,那么打開文件的數量可能成為一個問題。在大多數環境中,主動更新的文件數量很少。應該相應地設置close_inactive配置選項,以關閉不再活動的文件。
5.2. Filebeat沒有從一個文件收集行
為了解決這個問題:
- 確保路徑配置正確
- 檢查這個文件是不是比指定的ignore_older值更舊
- 確保Filebeat能夠發送時間到配置的輸出。以debug模式運行Filebeat來檢查是否可以成功發送事件:
-
./filebeat -c config.yml -e -d "*"
https://www.elastic.co/guide/en/beats/filebeat/current/faq.html
5.3. Filebeat占用了太多CPU資源
Filebeat可能配置掃描文件太過頻繁。檢查filebeat.yml中的scan_frequency設置。