Filebeats 采集日志到ES


什么是 Filebeat?
Filebeat 是一個屬於 Beats 系列的日志托運者 - 一組安裝在主機上的輕量級托運人,用於將不同類型的數據傳送到 ELK 堆棧進行分析。每個 Beat 專門用於傳送不同類型的信息 - 例如,Winlogbeat 發布 Windows 事件日志,Metricbeat 發布主機指標等等。顧名思義,Filebeat 提供日志文件。

在基於 ELK 的日志記錄管道中,Filebeat 扮演日志代理的角色 - 安裝在生成日志文件的計算機上,跟蹤它們,並將數據轉發到Logstash 以進行更高級的處理,或者直接轉發到 Elasticsearch 進行索引。因此,Filebeat 不是 Logstash 的替代品,但在大多數情況下可以並且應該同時使用。您可以在 本文中閱讀 有關 Beats 和 Filebeat 開發背后的故事的更多信息。

 

Logstash 需要運行 JVM,這種依賴性與 Ruby 中的實現相結合成為大量內存消耗的根本原因,尤其是涉及多個管道和高級過濾時。

Beats 是基於 Lumberjack 協議用 Go 語言編寫的,旨在實現內存占用少,處理大量數據,支持加密以及有效處理背壓。例如,Filebeat 記錄在注冊表中索引的最后一條成功行,因此,如果網絡問題或傳輸中斷,Filebeat將記住重新建立連接時中斷的位置。如果輸出,Logstash 或 Elasticsearch 存在攝取問題,Filebeat 將減慢文件讀取速度。

在選用 Filebeat 或者是 Logstash 呢?
簡單的答案是 - 至少在記錄文件時,您幾乎總是需要使用 Filebeat 和 Logstash 的組合。為什么?因為除非您只對時間戳和消息字段感興趣,否則仍需要 Logstash 用於 ETL(轉換)中的 “T”,並充當多個日志記錄管道的聚合器。

Filebeat 是當今最好的日志文件發送器之一 - 它輕量級,支持 SSL 和 TLS 加密,支持背壓,具有良好的內置恢復機制,並且非常可靠。但是,在大多數情況下,它不能使用用於日志增強的過濾器將日志轉換為易於分析的結構化日志消息。這就是 Logstash 所扮演的角色。

Logstash 充當聚合器 - 在將數據推送到管道之前從各種源中提取數據,通常是 Elasticsearch,但也可以是大型生產環境中的緩沖組件。值得一提的是,最新版本的 Logstash 還包括在磁盤上存儲消息隊列時對持久隊列的支持。如果你想了解更多,請參閱文章 “Logstash: Persistent Queue”。

Filebeat 和 Beats 系列的其他成員充當部署在邊緣主機上的輕量級代理,將數據泵入 Logstash 以進行聚合,過濾和豐富。

安裝 Filebeat
deb:

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-amd64.deb
sudo dpkg -i filebeat-7.3.1-amd64.deb
rpm:

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-x86_64.rpm
sudo rpm -vi filebeat-7.3.1-x86_64.rpm
mac:

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-darwin-x86_64.tar.gz
tar xzvf filebeat-7.3.1-darwin-x86_64.tar.gz
brew:

brew tap elastic/tap
brew install elastic/tap/filebeat-full
linux:

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-linux-x86_64.tar.gz
tar xzvf filebeat-7.3.1-linux-x86_64.tar.gz
這樣我們的 Filebeat 就安裝好了。請注意:由於 ELK 迭代比較快,我們可以把上面的版本 7.3.1 替換成我們需要的版本即可。我們先不要運行 Fliebeat。
我們通常可以使用如下的命令來導入我們需要的預知的 dashboard 已經 ingest pipeline:

./filebeat setup
關於上面的命令的解釋,如果你有興趣的話,可以參考文章 “Beats:解密 Filebeat 中的 setup 命令”。

在默認的情況下,我們直接運行 filebeat 的話,它選擇的默認的配置文件是當前目錄下的 filebeat.yml 文件。

filebeat.yml

filebeat.inputs:
- type: log
enabled: true
paths:
- ./sample.log

output.logstash:
hosts: ["localhost:5044"]
我們可以打入一個測試命令來看一下執行的結果:

./filebeat test output
顯示結果:

logstash: localhost:5044...
connection...
parse host... OK
dns lookup... OK
addresses: ::1, 127.0.0.1
dial up... ERROR dial tcp 127.0.0.1:5044: connect: connection refused
返回信息顯示,logstash 沒有運行,端口 5044 沒有被打開。在今天的練習中,我們將不使用 Logstash。我們直接將從 Filebeat 中收集到的數據發送到 Elasticsearch 中。

准備測試數據
我們在網址 https://logz.io/sample-data 下載一個叫做 apache-daily-access.log 的 log 文件。我們用 Atom 編輯器打開這個文件,顯示有 17279 條數據:

 

每一條的數據是這樣的格式:

20.168.183.41 - - [11/Sep/2019:00:00:05 +0000] "GET /category/health HTTP/1.1" 200 132 "/item/software/623" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.77 Safari/535.7"

配置 Filebeat


為了能夠 filebeat 把這個 log 數據傳輸到 Elasticsearch,我們可以使用如下的配置文件。我們創建一個叫做 filebeat_es.yml 文件:

filebeat.inputs:
- type: log
enabled: true
paths:
- /Users/liuxg/data/apache-daily-access.log

output:
elasticsearch:
hosts: ["localhost:9200"]
這里的配置非常簡單。在上面的 paths 里,它指向我們的存放的 log 文件。當你們自己做這個練習的時候,請修改這個文件的路徑。我們可以直接運行 filebeat:

$ ./filebeat -c filebeat_es.yml
我們也可以這樣寫:

filebeat.inputs:
- type: log
enabled: true
fields:
apache: true
paths:
- /Users/liuxg/data/apache-daily-access.log

output.elasticsearch:
hosts: ["localhost:9200"]
請注意這里的 output.elasticsearch。這樣的寫法和上面的稍微有些不同。看個人的愛好。更多的配置可以參閱 鏈接。在上面,我們在 source 里加入了一個 fields 叫做 “appach: true"。

{
"_index" : "filebeat-7.3.0-2019.09.11-000001",
"_type" : "_doc",
"_id" : "637VIG0BJD_DqHjgqvC5",
"_score" : 1.0,
"_source" : {
"@timestamp" : "2019-09-11T14:58:55.902Z",
"message" : """144.228.123.71 - - [11/Sep/2019:01:52:35 +0000] "GET /category/games HTTP/1.1" 200 117 "/search/?c=Books+Software" "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"""",
"input" : {
"type" : "log"
},
"fields" : {
"apache" : true
},
"ecs" : {
"version" : "1.0.1"
},
"host" : {
"name" : "localhost"
},
"agent" : {
"hostname" : "localhost",
"id" : "c88813ba-fdea-4a98-a0be-468fb53566f3",
"version" : "7.3.0",
"type" : "filebeat",
"ephemeral_id" : "ec3328d6-f7f0-4134-a2b6-8ff0c5141cc5"
},
"log" : {
"offset" : 300352,
"file" : {
"path" : "/Users/liuxg/data/apache-daily-access.log"
}
}
}
}
你也可以加入一些 tags:

filebeat.inputs:
- type: log
enabled: true
fields:
apache: true
tags: ["my-service", "hardware", "test"]
paths:
- /Users/liuxg/data/apache-daily-access.log

output.elasticsearch:
hosts: ["localhost:9200"]
這樣在 _source 里就會出現一些 tag:

{
"_index" : "filebeat-7.3.0-2019.09.11-000001",
"_type" : "_doc",
"_id" : "HIHyIG0BJD_DqHjgm0uL",
"_score" : 1.0,
"_source" : {
"@timestamp" : "2019-09-11T15:30:33.163Z",
"agent" : {
"id" : "c88813ba-fdea-4a98-a0be-468fb53566f3",
"version" : "7.3.0",
"type" : "filebeat",
"ephemeral_id" : "6fc482b2-fac8-4d79-8ca1-b27ef39cea3d",
"hostname" : "localhost"
},
"log" : {
"file" : {
"path" : "/Users/liuxg/data/apache-daily-access.log"
},
"offset" : 11497
},
"message" : """164.51.31.185 - - [11/Sep/2019:00:04:15 +0000] "GET /item/giftcards/232 HTTP/1.1" 200 130 "/category/electronics" "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"""",
"tags" : [
"my-service",
"hardware",
"test"
],
"input" : {
"type" : "log"
},
"fields" : {
"apache" : true
},
"ecs" : {
"version" : "1.0.1"
},
"host" : {
"name" : "localhost"
}
}
}
那么在我們的 Kibana 中,我們可以看到一個叫做 filebeat-7.3.0-2019.09.11-000001 的 index 文件已經生產了:

 

Filebeat Processors
雖然不像 Logstash 那樣強大和強大,但 Filebeat 可以在將數據轉發到您選擇的目標之前對日志數據應用基本處理和數據增強功能。 您可以解碼 JSON 字符串,刪除特定字段,添加各種元數據(例如 Docker,Kubernetes)等。

處理器在每個 prospector 的 Filebeat 配置文件中定義。 您可以使用條件語句定義規則以應用處理。 下面是一個使用 drop_fields 處理器從 Apache 訪問日志中刪除一些字段的示例:

filebeat.inputs:
- type: log
enabled: true
fields:
apache: true
tags: ["my-service", "hardware", "test"]
paths:
- /Users/liuxg/data/apache-daily-access.log

processors:
- drop_fields:
fields: ["ecs"]


output.elasticsearch:
hosts: ["localhost:9200"]
在上面,我們把 ecs 字段刪除,那么顯示的結果為:

{
"_index" : "filebeat-7.3.0-2019.09.11-000001",
"_type" : "_doc",
"_id" : "m4H8IG0BJD_DqHjgZ47a",
"_score" : 1.0,
"_source" : {
"@timestamp" : "2019-09-11T15:41:15.306Z",
"host" : {
"name" : "localhost"
},
"agent" : {
"type" : "filebeat",
"ephemeral_id" : "d32d0cea-966a-48d7-8728-dad5fc276b3a",
"hostname" : "localhost",
"id" : "c88813ba-fdea-4a98-a0be-468fb53566f3",
"version" : "7.3.0"
},
"log" : {
"offset" : 11497,
"file" : {
"path" : "/Users/liuxg/data/apache-daily-access.log"
}
},
"message" : """164.51.31.185 - - [11/Sep/2019:00:04:15 +0000] "GET /item/giftcards/232 HTTP/1.1" 200 130 "/category/electronics" "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"""",
"tags" : [
"my-service",
"hardware",
"test"
],
"input" : {
"type" : "log"
},
"fields" : {
"apache" : true
}
}
}
顯然相比較之前的 source,我們可以看出來 ecs 項已經不見了。

所有的 Processors 在一下列出:

add_cloud_metadata
add_locale
decode_json_fields
drop_event
drop_fields
include_fields
add_kubernetes_metadata
add_docker_metadata
你可以閱讀文章 “Beats:Beats processors” 以了解更多。

Filebea 調試
默認情況下,Filebeat 將其所有輸出發送到 syslog。 在前台運行 Filebeat 時,可以使用 -e 命令行標志將輸出重定向到標准錯誤。 例如:

filebeat -e
默認配置文件是 filebeat.yml(文件的位置因平台而異)。 您可以通過指定 -c 標志來使用其他配置文件。 例如:

filebeat -e -c myfilebeatconfig.yml
您可以通過啟用一個或多個調試選擇器來增加調試消息的詳細程度。 例如,要查看已發布的事務,可以使用發布選擇器啟動 Filebeat,如下所示:

filebeat -e -d "publish"
如果你想要所有的調試輸出(公平警告,它是相當多的),你可以使用*,像這樣:

filebeat -e -d "*"
原文鏈接:Elastic 中國社區官方博客


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM