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

관련 정보