簡單概述
最近在了解ELK做日志采集相關的內容,這篇文章主要講解通過filebeat來實現日志的收集。日志采集的工具有很多種,如fluentd, flume, logstash,betas等等。首先要知道為什么要使用filebeat呢?因為logstash是jvm跑的,資源消耗比較大,啟動一個logstash就需要消耗500M左右的內存,而filebeat只需要10來M內存資源。常用的ELK日志采集方案中,大部分的做法就是將所有節點的日志內容通過filebeat送到kafka消息隊列,然后使用logstash集群讀取消息隊列內容,根據配置文件進行過濾。然后將過濾之后的文件輸送到elasticsearch中,通過kibana去展示。
filebeat介紹
Filebeat由兩個主要組成部分組成:prospector和 harvesters。這些組件一起工作來讀取文件並將事件數據發送到您指定的output。
什么是harvesters?
harvesters負責讀取單個文件的內容。harvesters逐行讀取每個文件,並將內容發送到output中。每個文件都將啟動一個harvesters。harvesters負責文件的打開和關閉,這意味着harvesters運行時,文件會保持打開狀態。如果在收集過程中,即使刪除了這個文件或者是對文件進行重命名,Filebeat依然會繼續對這個文件進行讀取,這時候將會一直占用着文件所對應的磁盤空間,直到Harvester關閉。默認情況下,Filebeat會一直保持文件的開啟狀態,直到超過配置的close_inactive參數,Filebeat才會把Harvester關閉。
關閉Harvesters會帶來的影響:
file Handler將會被關閉,如果在Harvester關閉之前,讀取的文件已經被刪除或者重命名,這時候會釋放之前被占用的磁盤資源。
當時間到達配置的scan_frequency參數,將會重新啟動為文件內容的收集。
如果在Havester關閉以后,移動或者刪除了文件,Havester再次啟動時,將會無法收集文件數據。
當需要關閉Harvester的時候,可以通過close_*配置項來控制。
什么是Prospector?
Prospector負責管理Harvsters,並且找到所有需要進行讀取的數據源。如果input type配置的是log類型,Prospector將會去配置度路徑下查找所有能匹配上的文件,然后為每一個文件創建一個Harvster。每個Prospector都運行在自己的Go routine里。
Filebeat目前支持兩種Prospector類型:log和stdin。每個Prospector類型可以在配置文件定義多個。log Prospector將會檢查每一個文件是否需要啟動Harvster,啟動的Harvster是否還在運行,或者是該文件是否被忽略(可以通過配置 ignore_order,進行文件忽略)。如果是在Filebeat運行過程中新創建的文件,只要在Harvster關閉后,文件大小發生了變化,新文件才會被Prospector選擇到。
filebeat工作原理
安裝filebeat服務
下載和安裝key文件
rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
創建yum源文件
[root@localhost ~]# vim /etc/yum.repos.d/elk-elasticsearch.repo [elastic-5.x] name=Elastic repository for 5.x packages baseurl=https://artifacts.elastic.co/packages/5.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md
開始安裝
yum install filebeat
啟動服務
systemctl start filebeat
systemctl status filebeat
收集日志
這里我們先以收集docker日志為例,簡單來介紹一下filebeat的配置文件該如何編寫。具體內容如下:
[root@localhost ~]# grep "^\s*[^# \t].*$" /etc/filebeat/filebeat.yml filebeat.prospectors: - input_type: log paths: - /var/lib/docker/containers/*/*.log output.elasticsearch: hosts: ["192.168.58.128:9200"]
和我們看的一樣,其實並沒有太多的內容。我們采集/var/lib/docker/containers/*/*.log,即filebeat所在節點的所有容器的日志。輸出的位置是我們ElasticSearch的服務地址,這里我們直接將log輸送給ES,而不通過Logstash中轉。
再啟動之前,我們還需要向ES提交一個filebeat index template,以便讓elasticsearch知道filebeat輸出的日志數據都包含哪些屬性和字段。filebeat.template.json這個文件安裝完之后就有,無需自己編寫,找不到的同學可以通過find查找。加載模板到elasticsearch中:
[root@localhost ~]# curl -XPUT 'http://192.168.58.128:9200/_template/filebeat?pretty' -d@/etc/filebeat/filebeat.template.json { "acknowledged" : true }
重啟服務
systemctl restart filebeat
提示:如果你啟動的是一個filebeat容器,需要將/var/lib/docker/containers目錄掛載到該容器中;
Kibana配置
如果上面配置都沒有問題,就可以訪問Kibana,不過這里需要添加一個新的index pattern。按照manual中的要求,對於filebeat輸送的日志,我們的index name or pattern應該填寫為:"filebeat-*"。