前面的ELK 中咱們使用的是 Filebeat 收集Docker日誌,利用的是默認的logging driver json-file。本節咱們將使用 fluentd 來收集容器的日誌。
Fluentd 是一個開源的數據收集器,他目前有超過500中的plugin,能夠鏈接各類數據源和數據輸出組件。在下面的實踐中,Fluentd會負責收集容器日誌,而後發送給Elasticsearch。日誌的處理流程以下:
這裏咱們用 Filebeat 將 Fluentd 收集到的日誌轉發給 Elasticsearch。這固然不是惟一的方案,Fluentd有一個 plugin 「fluent-plugin-elasticsearch」能夠直接將日誌發送給Elasticsearch。條條大路通羅馬,開源世界給了咱們不少可能性,能夠根據須要選擇合適的方案。
安裝 Fluentd
一樣,最高效的時間方式是運行一個 fluentd 容器
root@host1:/var/log# docker run -d -p 24224:24224 -p 24224:24224/udp -v /data:/fluentd/log fluent/fluentd
Fluentd會在tcp和udp 的24224 端口上接收日誌數據,日誌將保存在Host 的 /data 目錄中。
從新配置 Filebeat ,添加對 /data目錄的監控
root@host1:~# vim /etc/filebeat/filebeat.yml
#=========================== Filebeat inputs =============================
filebeat.inputs:
- type: log
enabled: true
paths:
- /data/*.log
root@host1:~# systemctl restart filebeat.service
啓動測試容器
docker run --name log-test-container-A -d \
--log-driver=fluentd \
--log-opt fluentd-address=localhost:24224 \
--log-opt tag="log-test-container-A" \
busybox sh -c 'while true; do echo "This is a log message from container A"; sleep 10; done;'
docker run --name log-test-container-B -d \
--log-driver=fluentd \
--log-opt fluentd-address=localhost:24224 \
--log-opt tag="log-test-container-B" \
busybox sh -c 'while true; do echo "This is a log message from container B"; sleep 10; done;'
--log-driver=fluentd
告訴容器使用fluentd的logging driver
--log-opt fluentd-address=localhost:24224
將容器的日誌發送到Fluentd的數據接收端口
--log-opt tag="log-test-container-A"
在日誌中添加tag,用於區分不一樣的容器
在Kibana中查詢容器日誌