zep*_*yrJ 7 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
Run Code Online (Sandbox Code Playgroud)
然而,无论何时从进程 B 打印消息,打印的消息前面仍然是进程 A 的名称。
Nov 09 16:27:18 hostname processA [1417]: message from process B
Run Code Online (Sandbox Code Playgroud)
我认为这是预期的行为,因为它显示了由 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
Run Code Online (Sandbox Code Playgroud)
我的问题是:journalctl 中的输出是否可以在捕获输出时显示子进程名称?
我找到了答案。您需要使用 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);
Run Code Online (Sandbox Code Playgroud)
输出:
Feb 10 17:11:48 hostname processB [1418]: Found the answer
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1499 次 |
| 最近记录: |