systemd - Journalctl 出力は常にログエントリに親プロセス名を表示します。

systemd - Journalctl 出力は常にログエントリに親プロセス名を表示します。

systemdによって開始されたプロセスがあります。これをAと呼びます。このプロセスは多くのサブプロセスを生成します。 1つだけ選択して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 processAsystemdは複数のプロセスがあることを知っているようです。

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

関連情報