在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
- 參考:
- https://www.projectatomic.io/blog/2014/09/running-syslog-within-a-docker-container/
- https://linux.die.net/man/8/rsyslogd
- https://lists.freedesktop.org/archives/systemd-devel/2014-August/022295.html#journald
- https://manpages.debian.org/testing/systemd/systemd.socket.5.en.html
- https://unix.stackexchange.com/questions/332274/is-systemd-journald-a-syslog-implementation