使用fluentd做爲docker日誌驅動收集日誌

前言

docker默認的日誌驅動是json-file,每個容器都會在本地生成一個/var/lib/docker/containers/containerID/containerID-json.log,而日誌驅動是支持擴展的,本章主要講解的是Fluentd驅動收集docker日誌.node

Fluentd是用於統一日誌記錄層的開源數據收集器,是繼Kubernetes、Prometheus、Envoy 、CoreDNS 和containerd後的第6個CNCF畢業項目,經常使用來對比的是elastic的logstash,相對而言fluentd更加輕量靈活,如今發展很是迅速社區很活躍,在編寫這篇blog的時候github的star是8.8k,fork是1k就可見一斑.git

前提

  1. docker
  2. 瞭解fluentd配置
  3. docker-compose

準備配置文件

docker-compose.ymlgithub

version: '3.7'

x-logging:
  &default-logging
  driver: fluentd
  options:
    fluentd-address: localhost:24224
    fluentd-async-connect: 'true'
    mode: non-blocking
    max-buffer-size: 4m
    tag: "kafeidou.{{.Name}}"  #配置容器的tag,以kafeidou.爲前綴,容器名稱爲後綴,docker-compose會給容器添加副本後綴,如 fluentd_1

services:

  fluentd:
   image: fluent/fluentd:v1.3.2
   ports:
    - 24224:24224
   volumes:
    - ./:/fluentd/etc
    - /var/log/fluentd:/var/log/fluentd
   environment:
    - FLUENTD_CONF=fluentd.conf

  fluentd-worker:
   image: fluent/fluentd:v1.3.2
   depends_on:
     - fluentd
   logging: *default-logging

fluentd.confdocker

<source>
  @type forward
  port 24224
  bind 0.0.0.0
</source>

<match kafeidou.*>
  @type              file
  path               /var/log/fluentd/kafeidou/${tag[1]}
  append             true
  <format>
    @type            single_value
    message_key      log
  </format>
  <buffer tag,time>
    @type             file
    timekey           1d
    timekey_wait      10m
    flush_mode        interval
    flush_interval    5s
  </buffer>
</match>

<match **>
  @type              file
  path               /var/log/fluentd/${tag}
  append             true
  <format>
    @type            single_value
    message_key      log
  </format>
  <buffer tag,time>
    @type             file
    timekey           1d
    timekey_wait      10m
    flush_mode        interval
    flush_interval    5s
  </buffer>
</match>

因爲fluentd須要在配置的目錄中有寫入的權限,因此須要先準備好存放log的目錄以及給予權限.
建立目錄json

mkdir /var/log/fluentd

給予權限,這裏用於實驗演示,直接受權777架構

chmod -R 777 /var/log/fluentd

在docker-compose.yml和fluentd.conf的目錄中執行命令:
docker-compose up -dapp

[root@master log]# docker-compose up -d
WARNING: The Docker Engine you're using is running in swarm mode.

Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node.

To deploy your application across the swarm, use `docker stack deploy`.

Creating network "log_default" with the default driver
Creating fluentd ... done
Creating fluentd-worker ... done

查看一下日誌目錄下,應該就有對應的容器日誌文件了:async

[root@master log]# ls /var/log/fluentd/kafeidou/
fluentd-worker.20200215.log  ${tag[1]}

這是我最後的一個實驗結果,會建立一個${tag[1]}目錄,挺奇怪的,並且在這個目錄下還會有兩個文件elasticsearch

[root@master log]# ls /var/log/fluentd/kafeidou/\$\{tag\[1\]\}/
buffer.b59ea0804f0c1f8b6206cf76aacf52fb0.log  buffer.b59ea0804f0c1f8b6206cf76aacf52fb0.log.meta

若是有明白這塊的也歡迎一塊兒交流!微服務

架構總結

爲何不用docker的原始日誌呢?

咱們先看一下原始的docker日誌是怎麼樣一個架構:

https://oscimg.oschina.net/oscnet/up-fe956b2be6ab7ddc5f7ae52828e0adb73ca.JPEG

docker會在本機的/var/lib/docker/containers/containerID/containerID-json.log路徑爲每個容器生成一個log文件,存儲docker的日誌.

上圖中總共有7個容器,當成7個微服務的話,在須要查看日誌的時候就已經很不方便了,最差狀況須要分別在三臺機器上查看每個容器的日誌.

使用了fluentd後有什麼不同?

使用fluentd收集docker日誌後能夠將容器彙總到一塊兒.來看看配置了本文的fluentd配置文件後的架構:

https://oscimg.oschina.net/oscnet/up-2637f24a21f099b3c6cb24e3257c5e33b6e.JPEG

因爲fluentd配置的是存儲在fluentd所在機器的本地目錄,因此效果是將其餘機器的容器日誌收集到fluentd所在機器的本地目錄中.

fluentd只能將容器日誌收集到本地嗎?

fluentd實際上能夠將收集到的日誌再次傳輸出去,例如傳輸到elasticsearch等存儲軟件中:

https://oscimg.oschina.net/oscnet/up-d0974729a03700ee1353587d2cb43350a00.JPEG

fluentd靈活性

fluentd能作的事情還有不少,fluentd自己能做爲傳輸節點也能做爲接受節點,還可以過濾特定日誌,格式化特定內容的日誌,將匹配的特定日誌再次傳輸出去,這裏只是作到一個簡單的收集docker容器日誌的效果.

始發於 四顆咖啡豆 ,轉載請聲明出處.
關注公衆號->[四顆咖啡豆] 獲取最新內容
四顆咖啡豆

相關文章
相關標籤/搜索