本篇依照Fluentd官方教學來操作。
範例環境:
- MacBook Apple M1 Pro
- macOS Ventura 13.01
- Docker version 24.0.2
下載fluentd image
在命令列執行docker pull fluent/fluentd:edge-debian
下載fluentd的image。
% docker pull fluent/fluentd:edge-debian
edge-debian: Pulling from fluent/fluentd
50eb042e2421: Pull complete
e7f022c5984e: Pull complete
b2bea78520ca: Pull complete
6fd364618e0c: Pull complete
8e520102b3e5: Pull complete
61c0b5514864: Pull complete
d86fed8b0128: Pull complete
080ec58753c4: Pull complete
fda02f40ec29: Pull complete
cc26dcbe8c75: Pull complete
a1b70c6df0bd: Pull complete
e6f8bfd5858d: Pull complete
Digest: sha256:c7bd75c6666fbccf92cfd2f0f3a0ec5236b7e79f2291e83bf336546a19e0cc6b
Status: Downloaded newer image for fluent/fluentd:edge-debian
docker.io/fluent/fluentd:edge-debian
建立fluentd設定檔
在本機建立fluentd的設定檔fluentd.conf
,建立在當前工作目錄下的tmp
目錄,內容如下。
fluentd.conf
<source>
@type http
port 9880
bind 0.0.0.0
</source>
<match **>
@type stdout
</match>
設定檔fluentd.conf
作用為設定fluentd的輸入輸出行為,簡單說明如下:
<source>
- 設定fluentd的資料來源,並將來源轉為事件傳送給fluentd的路由引擎。@type
- 必填,用來指定input plugin。這邊為http
,代表in_http
input plugin。port
-http
的參數,代表要監聽的port。Fluentd預設用9880 port。bind
-http
的參數,代表要監聽的位址。0.0.0.0
代表所有位址。
<match>
- 找到與pattern匹配的tag事件並轉交給output plugin處理。**
即為pattern,表示任意tag。@type
- 必填,用來指定output plugin。這邊為stdout
,代表out_stdout
output plugin。
所以這邊的意思為將來自任何HTTP位址、9880 port的請求轉成fluentd事件並把所有事件透過標準輸出印出。
運行fluentd容器
執行docker run -p 9880:9880 -v $(pwd)/tmp:/fluentd/etc fluent/fluentd:edge-debian -c /fluentd/etc/fluentd.conf
雲型fluentd容器(由於沒加-d
參數所以非detached模式執行,運行後命令列會卡著)。
參數說明:
-p 9880:9880
- 本機9880 port對到fluentd容器的9880 port。-v $(pwd)/tmp:/fluentd/etc
- 把本機當前目錄($(pwd)
)下的tmp
作為volume,對應到容器的/fluentd/etc
目錄。-c /fluentd/etc/fluentd.conf
- 在容器名稱fluent/fluentd:edge-debian
後的-c
參數實際上是fluentd的參數--config
作用為告訴fluentd配置檔fluentd.conf
的路徑。(因為在fluentd的Dockerfile最後會執行fluentd
命令)
% docker run -p 9880:9880 -v $(pwd)/tmp:/fluentd/etc fluent/fluentd:edge-debian -c /fluentd/etc/fluentd.conf
fluentd -c /fluentd/etc/fluentd.conf
2023-08-25 10:02:07 +0000 [info]: init supervisor logger path=nil rotate_age=nil rotate_size=nil
2023-08-25 10:02:07 +0000 [info]: parsing config file is succeeded path="/fluentd/etc/fluentd.conf"
2023-08-25 10:02:07 +0000 [info]: gem 'fluentd' version '1.16.2'
2023-08-25 10:02:07 +0000 [warn]: define <match fluent.**> to capture fluentd logs in top level is deprecated. Use <label @FLUENT_LOG> instead
2023-08-25 10:02:07 +0000 [info]: using configuration file: <ROOT>
<source>
@type http
port 9880
bind "0.0.0.0"
</source>
<match **>
@type stdout
</match>
</ROOT>
2023-08-25 10:02:07 +0000 [info]: starting fluentd-1.16.2 pid=7 ruby="3.1.4"
2023-08-25 10:02:07 +0000 [info]: spawn command to main: cmdline=["/usr/local/bin/ruby", "-Eascii-8bit:ascii-8bit", "/usr/local/bundle/bin/fluentd", "-c", "/fluentd/etc/fluentd.conf", "--plugin", "/fluentd/plugins", "--under-supervisor"]
2023-08-25 10:02:07 +0000 [info]: #0 init worker0 logger path=nil rotate_age=nil rotate_size=nil
2023-08-25 10:02:07 +0000 [info]: adding match pattern="**" type="stdout"
2023-08-25 10:02:07 +0000 [info]: adding source type="http"
2023-08-25 10:02:07 +0000 [warn]: #0 define <match fluent.**> to capture fluentd logs in top level is deprecated. Use <label @FLUENT_LOG> instead
2023-08-25 10:02:07 +0000 [info]: #0 starting fluentd worker pid=16 ppid=7 worker=0
2023-08-25 10:02:07 +0000 [info]: #0 fluentd worker is now running worker=0
2023-08-25 10:02:07.917255429 +0000 fluent.info: {"pid":16,"ppid":7,"worker":0,"message":"starting fluentd worker pid=16 ppid=7 worker=0"}
2023-08-25 10:02:07.918229929 +0000 fluent.info: {"worker":0,"message":"fluentd worker is now running worker=0"}
測試
執行curl -X POST -d 'json={"json":"message"}' http://127.0.0.1:9880/sample.test
發送HTTP POST請求到127.0.0.1:9880/sample.test
及payload資料為JSON,內容為{"json":"message"}
。URI後面的sample.test
即為fluentd事件的tag。
% curl -X POST -d 'json={"json":"message"}' http://127.0.0.1:9880/sample.test
在執行fluentd容器的終端機可看到多了一行訊息,即為剛剛發送POST請求的log記錄。
2023-08-25 10:06:38.879920846 +0000 sample.test: {"json":"message"}
執行docker ps
查看fluentd容器的ID。
% docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2aafb0bbb2f5 fluent/fluentd:edge-debian "tini -- /bin/entryp…" 6 minutes ago Up 6 minutes 5140/tcp, 24224/tcp, 0.0.0.0:9880->9880/tcp condescending_wiles
執行docker logs 2aafb0bbb2f5 | tail -n 1
查看docker的log。
% docker logs 2aafb0bbb2f5 | tail -n 1
2023-08-25 10:06:38.879920846 +0000 sample.test: {"json":"message"}
沒有留言:
張貼留言