我有一个 systemd 服务,它启动多个输出到标准输出的第三方进程。有没有办法轻松确定哪些日志来自系统日志中的特定进程?
最近深入研究 systemd,我有一个关于日志记录的问题。man systemd-journald.service
指出:
它根据通过 libc syslog(3) 调用从用户进程接收到的日志信息创建和维护结构化的索引日志,来自系统服务的标准输入和标准错误或通过其本机 API。
我创建了一个简单的服务:
[Service]
ExecStart=/home/myself/logtest/runlogtest
并让脚本调用一些进程:
#!/bin/bash
...
/home/myself/logtest/app1 &
/home/myself/logtest/app2 &
...
当服务运行时,我使用以下命令监听消息:
journalctl -f | grep runlogtest
输出如下(对于本例,app1 输出“A”,app2 输出“B”):
Aug 07 14:22:04 localhost.localdomain runlogtest[8742]: B
Aug 07 14:22:07 localhost.localdomain runlogtest[8742]: A
Aug 07 14:22:07 localhost.localdomain runlogtest[8742]: B
Aug 07 14:22:10 localhost.localdomain runlogtest[8742]: B
Aug 07 14:22:11 localhost.localdomain runlogtest[8742]: A
Aug 07 14:22:13 localhost.localdomain runlogtest[8742]: B
Aug 07 14:22:15 localhost.localdomain runlogtest[8742]: A
无论如何,是否知道“A”日志来自 app1(而“B”消息来自 app2)?
我现在能看到的唯一解决方案是:
- 在自己的服务中管理每个应用程序(我想避免这种情况)。
- 为进程制作一个包装器,我捕获它们的标准输出并通过系统日志将其泵送到日志中。
答案1
为进程制作一个包装器,我捕获它们的标准输出并通过系统日志将其泵送到日志中。
这样的包装器已经存在并且称为systemd-cat
。
您可以按如下方式使用它:
systemd-cat -t app1 /home/myself/logtest/app1 &
systemd-cat -t app2 /home/myself/logtest/app2 &
的参数-t
是任意标识字符串,类似于(等效)syslog 的标识符。
也可以systemd-cat
在 shell 管道中使用,如下所示:
/home/myself/logtest/app1 |& systemd-cat -t app1 &
(这|&
是一个 bash 结构,用于管道 stdout 和 stderr。)
然而,第一种形式更可取,因为它避免产生额外的进程并对所有记录的数据进行额外的复制。