Detectar se o programa deve logar ao journal ou stdout do systemd

1

Estou atualizando um conjunto de programas para o RHEL7, algumas , algumas . Se eles forem iniciados como serviços do systemd, eu gostaria que eles escrevessem no diário do systemd. Se eles forem executados diretamente no terminal, por exemplo, para testes, quero que eles gravem no stdout. Como posso fazer isso com mais elegância?

Eu quero aproveitar os recursos avançados do diário - gravidade do registro, nome do arquivo, número da linha, nome do thread, etc. - então, simplesmente escrever para stdout não é suficiente.

A pesquisa que fiz rendeu conselhos para verificar o PID pai do processo ou verificar seu cgroup. Existe uma maneira melhor? Essas parecem soluções relaxadas. Idealmente, haveria uma função que eu poderia chamar ou uma variável de ambiente para verificar.

Informação adicional:

  • Para os programas planejo chamar < href="https://www.freedesktop.org/software/systemd/man/sd_journal_print.html"> sd_journal_print (3) .
  • Para os programas , pretendo usar o SLF4J + Logback + < href="https://github.com/gnieh/logback-journal"> logback-journal .

(Meu plano de fallback é usar uma opção de linha de comando, mas com certeza seria bom autodetectar.)

    
por John Kugelman 30.09.2016 / 21:08

2 respostas

2

Na versão 231 do systemd, a variável de ambiente JOURNAL_STREAM foi introduzida para esse propósito. Seu programa verifica seu valor, compara seu valor com o dispositivo e o número do nó-i de seu erro padrão e altera seu comportamento de acordo.

Quando não está conectado ao diário, você pode (é claro) sempre empregar algo como JSON escrito (como uma única linha por objeto) no erro padrão, para ter registros de log estruturados lá também. O RFC 5424 também possui opções de dados estruturados (mais limitadas).

    
por 02.10.2016 / 02:23
3

systemd já lida com este caso de maneira elegante para você, conforme documentado em systemd.exec .

Faça o login no STDOUT. Quando executado via systemd, o systemd usará como padrão o redirecionamento do STDOUT para o diário.

Outra opção é journal+console se você quiser sempre logar em ambos.

O registro em log no STDOUT também é uma prática recomendada no design de aplicativo 12 Fator .

    
por 30.09.2016 / 22:37