如何透過 Docker 來使用 Fluentd

首先先介紹一下 Fluentd 怎麼念,這個詞從我進 KKBOX 以來到現在一直都不知道怎麼念,但同事都是念「 Fluent and d 」所以我也跟著這樣念了,今天好奇查了一下真正的念法是「 Fluent dee 」或是可以唸成「 Fluent d 」,詳細可以參考這篇文章

Fluentd 是一套開源軟體的資料蒐集器,時常備用在蒐集各式各樣的 Log 然後整理拋送到另外一個地方,講這樣很玄可以參考下面這張圖。

可以看到 Fluentd 會蒐集各式各樣的 Log 像是 Apache 的 access log 、應用程式的 log 或是系統記錄等等,經過 Fluentd 的 filter 整理後轉送給各式各樣的 Output , Fluentd 支援太多的 Output 了,詳細可以直接到這個網站上面直接查詢,真的是想的到的服務都有。

在 Docker 非常盛行的時代想要實做一個服務你不用自己架設,起一個 Docker 就可以了,下面會跟說明要如何進行測試,我將這次測試的原始碼放在這邊,有興趣可以直接 clone 下來玩玩。

首先需要先撰寫一個 fluent.conf 的設定檔讓 fluentd 執行使用,如下可以看到我有兩個來源分別是 apache-access.log 與 lumen.log 為了測試方便每次執行都會從頭開始讀取到結束,在輸出的部分我使用 file 來儲存並且透過 tag 與時間來區分我的 log 檔案。

<source>
  @type tail
  path /pod-data/apache-access.log
  pos_file /pod-data/apache-access.log.pos
  read_from_head true
  tag apache.access
  <parse>
    @type apache2
  </parse>
</source>

<source>
  @type tail
  path /pod-data/lumen.log
  pos_file /pod-data/lumen.log.pos
  read_from_head true
  tag lumen
  <parse>
    @type json
  </parse>
</source>

<match **>
  @type file
  path /fluentd/log/${tag}/${tag}.%Y%m%d
  <buffer tag,time>
    @type file
    flush_thread_count 8
    flush_at_shutdown true
    timekey_use_utc true
    timekey_wait 1m
    path /fluentd/log/buffer
  </buffer>
</match>

接著就是來使用 Docker 搭配我的設定檔來執行我的 Fluentd 測試。

> git clone https://github.com/hashman/docker-learning.git
> cd docker-learning/fluentd-demo
> docker run --rm --name fluentd -v ${PWD}/fluent.conf:/fluentd/etc/fluent.conf -v ${PWD}/dest_logs:/fluentd/log -v ${PWD}/src_logs:/pod-data fluent/fluentd:v1.10.1-debian-arm64-1.0

因為我是用 Raspberry Pi 來跑,所以我需要使用 arm base 的 docker image 來執行,如是 x86 / x64 的可以直接用 fluent/fluentd:v1.10.1-debian 這個 image tag 來使用就可以了,執行完成最終的 output 資料夾結構會長成這樣的分類。

├── dest_logs
│   ├── apache.access
│   │   └── apache.access.20200405_0.log
│   ├── buffer
│   │   ├── buffer.b5a2b33a4f6b37cbdd626aadd8b4d121f.log
│   │   └── buffer.b5a2b33a4f6b37cbdd626aadd8b4d121f.log.meta
│   └── lumen
│       └── lumen.20200405_0.log

相關的原始碼我有放在 Github 上面,有興趣可以抓下來玩玩,有任何問題歡迎留言或是 Github Issue 發問。