我們來繼續昨天未完成的 Fluentd 內容,
在 Fluentd 官方文件的 Docker Compose 說明,我們可以設定完 Compose YAML 跟 Fluentd 後,就可以跑起來了,
但在昨天嘗試時,卻一直都沒辦法跑起來,包含在我的 Mac 開發電腦上、跟 ubuntu Server 上都是,
因此,工程師最常見的 Debug 時間就這麼開始了。
在 Debug 的過程中,我主要是一直拿錯誤訊息作為關鍵字去 Google,
有時是 Container 啟動失敗的訊息,有時是 Log 中的 Error 字樣,
然而錯誤訊息有點太雜亂了,雖然有一絲線索,但是都不是很明確的關鍵證據,
有查到可能是 container network 的定義有問題,也有查到是 image 版本問題,也有查到是 Mac 的環境問題,
例如 docker/for-mac issue #2353、fluent/fluentd-docs-gitbook issue #391,
而且在嘗試後,問題也沒有被解決掉,
因此,我決定簡化測試的環境,
在官方的範例中,多了很多我目前不熟悉的部分,
httpd 是 Apache Web Server,還算 OK,但 Elasticsearch 跟 Kibana 我都還沒碰過,
而我最優先要達到的目標,應該是讓其他 Container 可以透過 Fluentd 的 Logging Driver 把 Log 訊息傳入 Fluentd container 中,
於是,我們先把一些相對無關的東西拿掉,並使用我這系列一直在用的爬蟲範例。
我們直接重寫一個 Docker Compose,經過幾番嘗試,終於有成功跑起來,
首先把 D17 - 團隊觀戰區爬蟲 v3 ft. AWS S3 的爬蟲程式移植過來,
接著在 Docker compose 加入 Fluentd:
version: '3'
services:
ithelp-team-crawler-s3:
build: .
image: 'ithelp-team-crawler-s3'
restart: unless-stopped
env_file:
- .env
# 在這裡加入 Fluentd Logging Driver
logging:
driver: "fluentd"
options:
fluentd-address: localhost:24224
tag: crawler
# 為了可以透過 Server localhost 使用 Fluentd 的 Port
extra_hosts:
- "localhost:host-gateway"
fluentd:
image: fluent/fluentd:edge-debian
volumes:
- ./fluentd.conf:/fluentd/etc/fluentd.conf
command: ["fluentd", "-c", "/fluentd/etc/fluentd.conf"]
ports:
- "24224:24224"
- "24224:24224/udp"
一方面在爬蟲 Container 加入 Fluentd Logging Driver 的設定,
另一方面參考 D27 - Fluentd 啟動 Fluentd container 的指令,在 YAML 中加入 fluentd container,
這裡注意一個小細節,我們需要定義 command
參數來明確指定 Fluentd 要使用的 config 路徑,
Fluentd 的 Config 檔就同時參考 D27 跟官方文件,使用 forward
類型,輸出到 stdout,
<source>
@type forward
port 24224
bind 0.0.0.0
</source>
<match **>
@type stdout
</match>
跑起來!
$ sudo docker compose up -d
並查看 Fluentd container 的 Log:
sudo docker logs 385f6db7b8e7
fluentd -c /fluentd/etc/fluentd.conf
2022-10-14 15:32:17 +0000 [info]: parsing config file is succeeded path="/fluentd/etc/fluentd.conf"
2022-10-14 15:32:17 +0000 [info]: gem 'fluentd' version '1.15.2'
2022-10-14 15:32:17 +0000 [warn]: define <match fluent.**> to capture fluentd logs in top level is deprecated. Use <label @FLUENT_LOG> instead
2022-10-14 15:32:17 +0000 [info]: using configuration file: <ROOT>
<source>
@type forward
port 24224
bind "0.0.0.0"
</source>
<match **>
@type stdout
</match>
</ROOT>
...
2022-10-14 15:32:21.000000000 +0000 crawler: {"container_id":"208c426f2c9da673cfcdf1906721656ac83e9d87af8dcbf9e47024d5a90bb1f3","container_name":"/d29-fluentd-logging-driver-ithelp-team-crawler-s3-1","source":"stdout","log":"Start to upload data of members for team 211"}
2022-10-14 15:32:21.000000000 +0000 crawler: {"container_id":"208c426f2c9da673cfcdf1906721656ac83e9d87af8dcbf9e47024d5a90bb1f3","container_name":"/d29-fluentd-logging-driver-ithelp-team-crawler-s3-1","source":"stdout","log":"Uploaded, team: 211"}
2022-10-14 15:32:21.000000000 +0000 crawler: {"source":"stdout","log":"Start to upload data of members for team 213","container_id":"208c426f2c9da673cfcdf1906721656ac83e9d87af8dcbf9e47024d5a90bb1f3","container_name":"/d29-fluentd-logging-driver-ithelp-team-crawler-s3-1"}
2022-10-14 15:32:21.000000000 +0000 crawler: {"container_id":"208c426f2c9da673cfcdf1906721656ac83e9d87af8dcbf9e47024d5a90bb1f3","container_name":"/d29-fluentd-logging-driver-ithelp-team-crawler-s3-1","source":"stdout","log":"Uploaded, team: 213"}
...
終於成功透過 Fluentd Logging Driver 寫入 Log!
可以注意到有個固定的格式,預設會寫入四個欄位:container_id
、container_name
、source
、log
,
範例程式碼可以在 這裡 找到,那我們今天就先到這邊。