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 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