我们有许多生产应用程序(第一方和第三方),它们将日志记录留给运行应用程序的进程,而只记录stdout
forINFO
和stderr
forERROR
日志(即只有 2 个日志优先级:)INFO|ERROR
。
对于应用程序的 systemd 服务单元,可以这样设置:
StandardOutput=journal
StandardError=journal
Run Code Online (Sandbox Code Playgroud)
这使得 DevOps 可以通过 systemd 单元和日志来管理一切,以便于集中日志收集、监控任何内容……并且他们不需要担心为部署的每个应用程序定位和解析不同格式/位置的不同日志。
systemd 的日志具有与 syslog 的 7 级消息优先级系统兼容的消息优先级系统。 INFO
是水平6
,ERROR
是水平3
。有关更多详细信息,请参阅参考资料。
问题是... systemd/journal 显然不区分从 stdout 与 stderr 写入日志的消息。stdout 和 stderr 消息都以默认优先级 6 ( ) 写入日志INFO
。
/opt/log-test.sh
StandardOutput=journal
StandardError=journal
Run Code Online (Sandbox Code Playgroud)
/etc/systemd/system/log-test.service
[Unit]
Description=log test for journal
[Service]
Type=simple
ExecStart=/opt/log-test.sh
StandardOutput=journal
StandardError=journal
SyslogIdentifier=log-test
Run Code Online (Sandbox Code Playgroud)
$ systemctl start log-test
$ journalctl -u log-test
-- Logs …
Run Code Online (Sandbox Code Playgroud)