Como determinar o processo de origem de um log gerado a partir de um serviço systemd?

2

Eu tenho um serviço systemd que inicia vários processos de terceiros que geram saída padrão. Existe alguma maneira de determinar facilmente quais logs são de processos específicos do diário do sistema?

Mergulhando no systemd recentemente, tive uma dúvida sobre o registro em log. man systemd-journald.service observa que:

It creates and maintains structured, indexed journals based on logging information that is received from the kernel, from user processes via the libc syslog(3) call, from standard input and standard error of system services or via its native API.

Eu criei um serviço simples:

[Service]
ExecStart=/home/myself/logtest/runlogtest

E peça ao script para invocar alguns processos:

#!/bin/bash

...
/home/myself/logtest/app1 &
/home/myself/logtest/app2 &
...

Quando o serviço está em execução, ouço mensagens usando o seguinte comando:

journalctl -f | grep runlogtest

A saída é vista como a seguinte (para este exemplo, a saída app1 'A' e a saída app2 'B'):

Aug 07 14:22:04 localhost.localdomain runlogtest[8742]: B
Aug 07 14:22:07 localhost.localdomain runlogtest[8742]: A
Aug 07 14:22:07 localhost.localdomain runlogtest[8742]: B
Aug 07 14:22:10 localhost.localdomain runlogtest[8742]: B
Aug 07 14:22:11 localhost.localdomain runlogtest[8742]: A
Aug 07 14:22:13 localhost.localdomain runlogtest[8742]: B
Aug 07 14:22:15 localhost.localdomain runlogtest[8742]: A

Existe alguma maneira de saber que os logs 'A' estão vindo do app1 (e as mensagens 'B' são do app2)?

As únicas soluções que posso ver agora é que gostaria de:

  • Gerencie cada aplicativo em seu próprio serviço (algo que gostaria de evitar).
  • Crie um wrapper para o processo que capture sua saída padrão e envie para o diário via syslog.
por jdknight 07.08.2014 / 20:45

1 resposta

4

Make a wrapper for process which I capture their standard output and pump to the journal via syslog.

Esse wrapper já existe e é chamado de systemd-cat .

Você pode usá-lo da seguinte maneira:

systemd-cat -t app1 /home/myself/logtest/app1 &
systemd-cat -t app2 /home/myself/logtest/app2 &

O argumento para -t é uma cadeia de identificação arbitrária, análoga (equivalente) ao identificador do syslog.

Também é possível usar systemd-cat em um pipeline de shell como este:

/home/myself/logtest/app1 |& systemd-cat -t app1 &

(O |& é uma construção bash para canalizar stdout e stderr.)

No entanto, a primeira forma é preferível, pois evita gerar um processo extra e fazer uma cópia extra de todos os dados registrados.

    
por 03.05.2015 / 22:05