rsyslog in docker environment

在docker中,預設沒有啟用systemd所需要的 CAP_SYS_ADMIN  privileged capabilities,因此在執行服務時,一般採用直接執行process的方式而不透過systemd控制(systemctl)

不過rsyslogd在CentOS預設是透過journald讀取syslog,journald在systemd的架構下主要處理來自systemd service的stdout/stderr、以及syslog(透過/run/systemd/journal/dev-log,並將/dev/log symlink到前述位置),以及處理systemd forward log到 /run/systemd/journal/syslog (須設定ForwardToSyslog開啟,新版本的rsyslogd已經直接讀取journal,不再使用此方式)

如果要跑journald則需要對docker另外開一些capabilites(可參考systemd的service裡面的CapabilityBoundingSet設定,雖然部分應該是處理kern log),另外要處理listen unix socket的設定(描述在/lib/systemd/system/systemd-journald.socket、/lib/systemd/system/syslog.socket) ,因此最簡單的方式就是直接讓rsyslog listen unix socket /dev/log,並且如果不用systemd,單純使用syslog的話沒有理由需要透過journald來處理。

在/etc/rsyslog.conf 將所有journald相關的設定註解,並且開啟imuxsock

#### MODULES ####
#for DOCKER add load imuxsock
module(load="imuxsock")
# The imjournal module bellow is now used as a message source instead of imuxsock.
#$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)

#for DOCKER remove imjournal module
#$ModLoad imjournal # provides access to the systemd journal

#...

# Turn off message reception via local log socket;
# local messages are retrieved through imjournal now.
# for DOCKER
#$OmitLocalLogging on

# File to store the position in the journal
#for DOCKER
#$IMJournalStateFile imjournal.state

並且刪掉 /etc/rsyslog.d/listen.conf

啟動rsyslogd就可以正常運行將syslog寫入到對應的log檔

以 logger測試

值得一提的是 因為透過imuxsock 模組讀取log,是透過 /dev/log unix socket 讀取log

而這個socket是由 rsyslogd產生的,logger預設也是寫入此socket

可參考 util-linux/logger.c

另外docker執行時,一般習慣上是用foreground執行,rsyslogd預設是會跑在背景,並且會做fork,這對於在整合一些process manager如supervisor或是chapterone的工具無法正確追蹤process是否正確執行,或是要設定專門的rsyslog server放在docker的entrypoint,因此在執行rsyslogd時,加上-n選項

/usr/sbin/rsyslogd -n

This entry was posted in System Administration. Bookmark the permalink.

Leave a Reply