我有许多使用 CoreOS 的服务器。CoreOS 原生使用 journald 来处理所有日志文件。最新稳定版本包含 docker 1.9,因此尚不支持 docker 日志驱动程序。
在探索了多种途径之后,我认为 rsyslog 可能是将日志放入 logz 的最简单方法,因为它在其文档中被列为支持日志发送器。
我发现有一个模块可以让你把日志和 rsyslog 连接在一起。所以,我使用容器尝试了一下。
根据 logz 文档,我可以使用 rsyslog 将日志发送给他们,方法是使用以下 rsyslogd.conf 配置
# -------------------------------------------------------
# File Logging Directives for Logz.io
# -------------------------------------------------------
$ModLoad imfile
$InputFilePollInterval 10
$PrivDropToGroup adm
$WorkDirectory /var/spool/rsyslog
# File access file:
$InputFileName PATH_TO_FILE
$InputFileTag TYPE:
$InputFileStateFile stat-TYPE
$InputFileSeverity info
$InputFilePersistStateInterval 20000
$InputRunFileMonitor
$template logzFormatFileTagName,"[SPECIAL_KEY_HERE] <%pri%>%protocol-version% %timestamp:::date-rfc3339% %HOSTNAME% %app-name% %procid% %msgid% [type=TYPE] %msg%\n"
if $programname == 'TYPE' then @@listener.logz.io:5000;logzFormatFileTagName
if $programname == 'TYPE' then ~
但是,因为我没有使用日志文件进行输入,而是通过 modimuxsock 使用 journald,所以我省略了所有日志文件配置并添加:
$ModLoad imuxsock.so
$OmitLocalLogging off
我创建了一个运行 rsyslogd 的简单 Docker 镜像。因此,最后我将以下内容作为配置文件,并通过 docker 的 run -v hostpath:containerpath 将套接字传递给 journald 套接字。
#
# http://www.rsyslog.com/doc/
#
# Input modules
$ModLoad immark.so # provide --MARK-- message capability
$ModLoad imuxsock.so # provides support for local system logging (e.g. via logger command)
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /etc/rsyslog.d/*.conf
$OmitLocalLogging off
$DebugFile /tmp/rsyslog-debug.log
$DebugLevel 2
$template logzFormatFileTagName,"[SPECIAL_KEY_HERE] <%pri%>%protocol-version% %timestamp:::date-rfc3339% %HOSTNAME% %app-name% %procid% %msgid% [type=docker] %msg%\n"
if $programname == 'docker' then @@listener.logz.io:5000;logzFormatFileTagName
if $programname == 'docker' then ~
说实话,我对 TYPE 设置有点困惑。我以为我应该将其设置为 dockerd。当你运行 journalctl -u unit 时,其中 unit 是在 docker 下运行服务的单元,它会显示例如
它是否正确?
我的 docker 镜像正在运行:
docker run --name=logzio-journald -v /run/systemd/journal/syslog:/run/systemd/journal/syslog --rm myregistry.com/logzio-journal-shipper
最后 30 行调试输出:注意,当 docker 记录某些内容时,不会再出现调试信息。我的 logz 帐户下也没有出现任何内容。
8562.569331781:main Q:Reg/w0 : processBATCH: next msg 1: warning: ~ action is deprecated, consider using the 'stop' statement instead [v8.9.0 try http://www.rsyslog.com/e/2307 ]
8562.569337108:main Q:Reg/w0 : IF
8562.569350044:main Q:Reg/w0 : var 'programname'
8562.569370397:main Q:Reg/w0 : ==
8562.569386822:main Q:Reg/w0 : string 'docker'
8562.569412534:main Q:Reg/w0 : eval expr 0x561c9dddcf80, type 'CMP_EQ'
8562.569419072:main Q:Reg/w0 : eval expr 0x561c9dddcf20, type 'V[86]'
8562.569425909:main Q:Reg/w0 : rainerscript: var 17: 'rsyslogd-2307'
8562.569454839:main Q:Reg/w0 : eval expr 0x561c9dddcf20, return datatype 'S'
8562.569463719:main Q:Reg/w0 : eval expr 0x561c9dddcf80, return datatype 'N'
8562.569469502:main Q:Reg/w0 : if condition result is 0
8562.569474698:main Q:Reg/w0 : IF
8562.569487271:main Q:Reg/w0 : var 'programname'
8562.569507498:main Q:Reg/w0 : ==
8562.569523822:main Q:Reg/w0 : string 'docker'
8562.569549617:main Q:Reg/w0 : eval expr 0x561c9dddf780, type 'CMP_EQ'
8562.569556377:main Q:Reg/w0 : eval expr 0x561c9dddefc0, type 'V[86]'
8562.569562533:main Q:Reg/w0 : rainerscript: var 17: 'rsyslogd-2307'
8562.569568453:main Q:Reg/w0 : eval expr 0x561c9dddefc0, return datatype 'S'
8562.569574734:main Q:Reg/w0 : eval expr 0x561c9dddf780, return datatype 'N'
8562.569580401:main Q:Reg/w0 : if condition result is 0
8562.569586028:main Q:Reg/w0 : END batch execution phase, entering to commit phase
8562.569592015:main Q:Reg/w0 : processBATCH: batch of 2 elements has been processed
8562.569598799:main Q:Reg/w0 : regular consumer finished, iret=0, szlog 0 sz phys 2
8562.569606353:main Q:Reg/w0 : DeleteProcessedBatch: we deleted 2 objects and enqueued 0 objects
8562.569612733:main Q:Reg/w0 : doDeleteBatch: delete batch from store, new sizes: log 0, phys 0
8562.569619238:main Q:Reg/w0 : regular consumer finished, iret=4, szlog 0 sz phys 0
8562.569624860:main Q:Reg/w0 : main Q:Reg/w0: worker IDLE, waiting for work.
8562.569640696:7f075a82dab0: thread created, tid 7, name 'in:imuxsock'
8562.569649200:7f075a82dab0: set thread name to 'in:imuxsock'
8562.569665945:imuxsock.c : --------imuxsock calling select, active file descriptors (max 4): 4
8562.569689335:7f075a843ab0: thread created, tid 6, name 'in:immark'
8562.569697227:7f075a843ab0: set thread name to 'in:immark'