我如何更改我的 syslog-ng 模板,以便当日志源自 systemd 服务/单元时,日志消息将包含该单元的名称?
使用${PROGRAM}
仅显示 systemd 服务调用的可执行文件的名称/消息源自该可执行文件的名称。journald 似乎有一个包含此信息的字段:_SYSTEMD_UNIT
,但在我的 syslog-ng 模板中引用它似乎不够。
我的设置背景:
我正在运行 Debian Jessie,并创建了 systemd 服务来管理 Docker 容器。这些容器中的应用程序会记录到 stdout / stderr,随后记录到 journald 控制的日志文件中。
我使用 syslog-ng(版本 3.5.6-2)将我的日志转发到 loggly 和 papertrail(现在正在比较它们)。由于我运行的是 Debian Jessie,我通过设置将 journald 配置为将日志消息转发到ForwardToSyslog=yes
syslog journald.conf
。
问题:
loggly 和 papertrail 的默认模板包含${PROGRAM}
在每个日志消息中,这是生成该消息的“可执行文件”的名称。但是,在我的设置中,调用的可执行文件适用docker
于我的所有容器。因此,可执行文件的名称对于帮助我过滤日志和识别来自特定容器的日志毫无用处。
笔记:
syslog-ng 文档指出有一个systemd-journal
驱动程序,它似乎提供了额外的变量。但是,该驱动程序似乎在 Debian Jessie 版本的 syslog-ng(3.5.6-2)中不可用
答案1
我还参考了来自 docker 的 journald 字段,基本上你必须.journald.
在字段名称前面添加,例如
...
template("<$PRI>1 ${ISODATE} ${HOST} ${.journald.CONTAINER_TAG:--} ${PID:--} ${.journald.CONTAINER_ID:--} - ${MSG}\n")
然后它就会像魔法一样起作用
<134>1 2018-06-14T10:29:08+00:00 typerpc-3 alpine-02.1.vj6qhqulxkkojb9uatd3v08ar 1015 ef4e25bad3a3 - mg 2
答案2
您可以在 syslog-ng 开发人员的存储库中找到适用于 Debian Jessie 的较新的 syslog-ng 软件包(其中包括 systemd-journal 驱动程序),网址为:https://build.opensuse.org/project/show/home:laszlo_budai:syslog-ng
我不确定这是否会使该字段在 syslog-ng 中可用(除非它在某处被翻译成 _COMM 或 SYSLOG-IDENTIFIER,请参阅http://support.oneidentity.com/technical-documents/syslog-ng-open-source-edition/administration-guide/source-read-receive-and-collect-log-messages/systemd-journal-collecting-messages-from-the-systemd-journal-system-log-storage),但如果确实需要,请在 Gitub 上打开一个问题https://github.com/balabit/syslog-ng
问候,罗伯特