更換docker日誌驅動

本文是關於docker日誌第三篇,更換docker日誌驅動爲-syslog。在以前的兩篇文章: Docker容器日誌分析 介紹過docker的json日誌滾動策略; fluentd收集kubernetes 集羣日誌分析 分析kubernetes中fluentd收集docke容器日誌原理。html

準備測試容器

準備一個自動生成日誌的容器,其 Dockerfile 以下:git

FROM alpine:3.7
CMD [ "sh", "-c", "while true; do echo hello; sleep 10; done"]
複製代碼

測試容器很簡單,每10s打印一次 hello 到控制檯。github

準備測試環境

測試環境,選擇使用compose,其文件 docker-compose.yaml 以下:docker

version: '3'
services:

  # https://github.com/rsyslog/rsyslog-docker
  rsyslog:
    image: rsyslog/syslog_appliance_alpine
    ports:
      - "514:514"
    volumes:
      - ./logs:/logs


  logapp:
    build: ./app
    image: logapp:0.0.1
    depends_on:
      - rsyslog
    logging:
      driver: "syslog"
      options:
        syslog-address: "tcp://127.0.0.1:514"
        tag: "app"
        labels: "testing,frontend"
複製代碼

rsyslog服務使用容器方式運行,省去物理機配置,方便清理。rsyslog 服務又做爲 logapp 測試容器的日誌接收器。json

注意mac須要替換127.0.0.1爲物理IPbash

測試

docker-compose.yaml 目錄使用 docker-compose up 啓動測試, 日誌輸出以下:網絡

Creating network "rsyslog_default" with the default driver
Creating rsyslog_rsyslog_1 ... done
Creating rsyslog_logapp_1  ... done
Attaching to rsyslog_rsyslog_1, rsyslog_logapp_1
logapp_1   | WARNING: no logs are available with the 'syslog' log driver
rsyslog_1  | rsyslog appliance version 2018-06-26 (1530020232) - http://www.syslogappliance.de
rsyslog_1  | Copyright (C) 2018 by Rainer Gerhards and Adiscon GmbH - released under ASL 2.0
rsyslog_1  |
rsyslog_1  | WARNING: this is an experimental container - do not use in production
rsyslog_1  |
rsyslog_1  | Using rsyslog configuration file: /etc/rsyslog.conf
rsyslog_1  | ENABLE_LOGSENE=off
rsyslog_1  | RSYSLOG_CONF=/etc/rsyslog.conf
rsyslog_1  | LOGFILES_STORE=/logs/hosts/%hostname:::secpath-replace%/messages.log
rsyslog_1  | HOSTNAME=6d034357ccb0
rsyslog_1  | SHLVL=1
rsyslog_1  | HOME=/root
rsyslog_1  | CNF_CALL_LOG_TO_LOGFILES=call log_to_files
rsyslog_1  | CNF_CALL_LOG_TO_LOGSENE=
rsyslog_1  | PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
rsyslog_1  | ENABLE_STATISTICS=on
rsyslog_1  | PWD=/home/appliance
rsyslog_1  | ENABLE_LOGFILES=on
rsyslog_1  | TZ=UTC
rsyslog_1  | rsyslogd 8.36.0: running as pid 1, enabling container-specific defaults, press ctl-c to terminate rsyslog
rsyslog_1  | 2019-05-01T15:15:22.330709+00:00 6d034357ccb0 rsyslogd: [origin software="rsyslogd" swVersion="8.36.0" x-pid="1" x-info="http://www.rsyslog.com"] start

複製代碼

日誌中重點是 logapp_1 | WARNING: no logs are available with the 'syslog' log driver 提示 logapp 的日誌再也不輸出到docker標準console中了,因此看不到容器的 hello 輸出。app

能夠註釋logging部分,對比一下日誌輸出。frontend

rsyslog 掛載的數據卷目錄 logs 中看到生成了一系列日誌:tcp

➜  logs tree -L 3
.
├── debug
└── hosts
    ├── 6d034357ccb0
    │   └── messages.log
    ├── e5281045a174
    │   └── messages.log
    └── localhost
        └── messages.log
複製代碼

其中localhost/messages.log信息以下:

2019-05-01T15:15:23+00:00 localhost app[1478]: hello
2019-05-01T15:15:33+00:00 localhost app[1478]: hello
2019-05-01T15:15:43+00:00 localhost app[1478]: hello
2019-05-01T15:15:53+00:00 localhost app[1478]: hello
...
複製代碼

可見 logapp 的日誌使用tcp傳輸到 rsyslog 中,並由後者寫入文件。

在官方的說明中,能夠在 daemon.json 中定義,統一替換docker日誌驅動:

{
  "log-driver": "syslog",
  "log-opts": {
    "syslog-address": "udp://1.2.3.4:1111"
  }
}
複製代碼

也能夠對單個容器使用 --log-driver 參數自定義更換,命令以下:

docker run \
      -–log-driver syslog –-log-opt syslog-address=udp://1.2.3.4:1111 \
      alpine echo hello world
複製代碼

固然,若是瞭解 compose ,推薦使用本文的方式替換,會更便捷。至於 rsyslog 的配置,比較複雜,請直接查看參考連接。

清理

使用 Ctrl + C 結束容器後,在使用 docker-compose down 將測試容器及網絡清理。

參考連接

相關文章
相關標籤/搜索