我在 ubuntu 机器上部署了几个守护进程,并将它们包装为 systemd 服务。他们的标准输出默认重定向到日志,这正是我所希望的。
现在,事实证明,ubuntu 上的默认配置(我猜 debian 上也是如此)是让日志将所有事件转发到 /run/systemd/journal/syslog (参见 /etc/systemd/journald.conf:#ForwardToSyslog=yes)并让 rsyslog 使用 imuxsock 模块从那里提取数据(请参阅 /etc/rsyslog.conf)。默认情况下,我还看到因为在 /etc/rsyslog.d/50-default.conf 中,我们有这一行:
。;auth,authpriv.none -/var/log/syslog
即,所有非身份验证数据最终都在 /var/log/syslog 中
因为我想跟踪journald中服务的输出,所以我通过创建/var/log/journal(在/etc/systemd/journald.conf中,Storage的默认值为auto)使journald日志文件持久化。
结果是现在我的所有日志数据都是重复的:它在journald中存储一次,在rsyslog的/var/log/syslog中存储一次。
因此,出于各种原因,我真的想将自己的服务数据保留在日志中,但我真的不想重复该数据(有很多日志!)。
我可以看到几个选项:
- 完全禁用 rsyslog。我担心如果我这样做,我可能会错过其他服务的大量数据:谁知道我的基础设施中的其他代码读取 /var/log/*
- 尝试仅禁用 daemon.info,因为这似乎是为我的服务选择的默认日志设施/级别。我担心以下内容可能会让我忽略恰好具有相同设施/级别的其他有用消息:/
。;auth,authpriv.none;守护进程!=信息-/var/log/syslog
- 更改 rsyslog/journald 集成以使用 imjournal 输入模块,忽略 imuxsock(就像在 fedora 上一样),并编写针对我的每个服务更具体的 rsyslog 规则
现在的问题是:推荐的继续方式是什么?
答案1
老问题我知道,但你已经快到了。要停止任何服务的任何日志条目进入系统日志,daemon.none
请像这样添加;
*.*;auth,authpriv.none,daemon.none -/var/log/syslog
守护进程的日志输出默认为SyslogFacility=daemon
您获取文件的原因daemon.log
。
我“认为”如果您只想将其用于您的一项服务,您可以在该服务文件中使用SyslogFacility=
带有local0
(0-9可用)的标识符,然后只需包含上面的相关指令(例如local0.none
)来过滤这些日志条目在......之外syslog
。
https://www.freedesktop.org/software/systemd/man/systemd.exec.html