systemd - Journalctl 输出始终在日志条目中显示父进程名称

systemd - Journalctl 输出始终在日志条目中显示父进程名称

我有一个由 systemd 启动的进程 - 我们称之为 A。这个进程会产生许多子进程 - 我们只取一个并称之为 B。

这是一个 C++ 应用程序。当您打印到 std::cout 时,输出将被 systemd 捕获,并可以使用 journalctl 命令查看。

每当一条消息从进程 A 打印到 std::cout 时,它就会出现在 Journalctl 输出中,并且日志消息前面带有进程 A 的名称 - 这是有意义的。

Nov 09 16:27:17 hostname processA [1417]: message from process A

然而,每当从进程 B 打印消息时,打印的消息前面仍然带有进程 A 的名称。

Nov 09 16:27:18 hostname processA [1417]: message from process B

我认为这是预期的行为,因为它显示了实际由 systemd 启动的进程的名称 - 忽略它是由该进程的子进程引发的事实。当您使用该systemctl status processA命令时,似乎 systemd 确实知道存在多个进程:

Active: active (running) since Wed 2016-11-09 16:27:20 GMT; 30min ago
 Main PID: 1417 (processA)
   CGroup: /system.slice/processA.service
           ├─1417 /opt/test/bin/processA
           ├─1450 /opt/test/bin/processB

我的问题是:有没有办法让journalctl中的输出在捕获输出时显示子进程名称?

答案1

我已经找到答案了。您需要使用 systemd/sd-journal.h 中的 sd_journal_send() 。您还可以使用 SYSLOG_IDENTIFIER 和 SYSLOG_PID 标记来自定义所使用的内容。可以找到有关可用标签的更多信息这里

例子:

std::string sysLogIdentifier("SYSLOG_IDENTIFIER=");
sysLogIdentifier += program_invocation_short_name;

std::string sysLogPid("SYSLOG_PID=");
sysLogPid += getpid();

sd_journal_send("MESSAGE=Found the answer",
                sysLogIdentifier.c_str(),
                sysLogPid.c_str(),
                NULL);

输出:

Feb 10 17:11:48 hostname processB [1418]: Found the answer

相关内容