systemd - journalctl output sempre mostra o nome do processo pai nas entradas de log

4

Eu tenho um processo que é iniciado pelo systemd - vamos chamá-lo A. Este processo gera numerosos processos filhos - vamos apenas pegar um e chamar B.

Este é um aplicativo C ++. Quando você imprime para std :: cout, a saída é capturada pelo systemd e pode ser visualizada com o comando journalctl.

Sempre que uma mensagem é impressa em std :: cout do processo A, ela aparece na saída do journalctl com o nome do processo A que precede a mensagem de log - faz sentido.

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

No entanto, sempre que uma mensagem é impressa do processo B, a mensagem impressa ainda é precedida pelo nome do processo A.

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

Suponho que esse seja o comportamento esperado, pois ele exibe o nome do processo que foi realmente iniciado pelo systemd - desconsiderando o fato de ter sido criado por um filho desse processo. Parece como se o systemd estivesse ciente de que há vários processos quando você usa o comando systemctl status processA :

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

Minha pergunta é: Existe uma maneira de a saída no journalctl exibir o nome do processo filho quando a saída é capturada?

    
por zephyrJ 09.11.2016 / 18:01

1 resposta

3

Eu encontrei a resposta. Você precisa usar sd_journal_send () em systemd / sd-journal.h. Você também pode usar as tags SYSLOG_IDENTIFIER e SYSLOG_PID para personalizar o que é usado. Mais informações sobre as tags disponíveis podem ser encontradas aqui .

Exemplo:

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

Saída:

Feb 10 17:11:48 hostname processB [1418]: Found the answer
    
por 10.02.2017 / 18:36