如何从 journald 中提取数据并通过 rsyslog 将其输出到 logz

如何从 journald 中提取数据并通过 rsyslog 将其输出到 logz

我有许多使用 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'

相关内容