如何确定从 systemd 服务生成的日志源进程?

如何确定从 systemd 服务生成的日志源进程?

我有一个 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。)

然而,第一种形式更可取,因为它避免产生额外的进程并对所有记录的数据进行额外的复制。

相关内容