iT邦幫忙

2022 iThome 鐵人賽

DAY 29
0

我們來繼續昨天未完成的 Fluentd 內容,

在 Fluentd 官方文件的 Docker Compose 說明,我們可以設定完 Compose YAML 跟 Fluentd 後,就可以跑起來了,

但在昨天嘗試時,卻一直都沒辦法跑起來,包含在我的 Mac 開發電腦上、跟 ubuntu Server 上都是,

因此,工程師最常見的 Debug 時間就這麼開始了。


Github Issue

在 Debug 的過程中,我主要是一直拿錯誤訊息作為關鍵字去 Google,
有時是 Container 啟動失敗的訊息,有時是 Log 中的 Error 字樣,

然而錯誤訊息有點太雜亂了,雖然有一絲線索,但是都不是很明確的關鍵證據,
有查到可能是 container network 的定義有問題,也有查到是 image 版本問題,也有查到是 Mac 的環境問題,

例如 docker/for-mac issue #2353fluent/fluentd-docs-gitbook issue #391
而且在嘗試後,問題也沒有被解決掉,

因此,我決定簡化測試的環境

在官方的範例中,多了很多我目前不熟悉的部分,
httpd 是 Apache Web Server,還算 OK,但 Elasticsearch 跟 Kibana 我都還沒碰過,

而我最優先要達到的目標,應該是讓其他 Container 可以透過 Fluentd 的 Logging Driver 把 Log 訊息傳入 Fluentd container 中,

於是,我們先把一些相對無關的東西拿掉,並使用我這系列一直在用的爬蟲範例。


Docker Compose

我們直接重寫一個 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_idcontainer_namesourcelog

範例程式碼可以在 這裡 找到,那我們今天就先到這邊。


上一篇
D28 - Fluentd Life Cycle
下一篇
D30 - 回顧 Docker 學習之路
系列文
其實沒有那麼難 — Docker30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言