Detectar se o programa deve registrar no diário do systemd ou stdout

Detectar se o programa deve registrar no diário do systemd ou stdout

Estou atualizando um conjunto de programas para RHEL7, alguns, alguns. Se eles forem iniciados como serviços do systemd, gostaria que eles escrevessem no diário do systemd. Se eles forem executados diretamente no terminal, digamos, para teste, quero que eles escrevam no stdout. Como posso fazer isso com mais elegância?

Quero aproveitar as vantagens dos recursos avançados do diário - gravidade do registro, nome do arquivo, número da linha, nome do thread, etc. - portanto, simplesmente escrever no 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 desajeitadas. Idealmente, haveria uma função que eu pudesse chamar ou uma variável de ambiente para verificar.

Informação adicional:

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

Responder1

Na versão 231 do systemd, a JOURNAL_STREAMvariável de ambiente foi introduzida exatamente 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.

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

Responder2

systemdjá trata deste caso com elegância para você, conforme documentado emsystemd.exec.

Faça logon em STDOUT. Quando executado via systemd, o systemd redirecionará STDOUT para o diário por padrão.

Outra opção é journal+consolese você sempre deseja fazer login em ambos.

Registrar em STDOUT também é uma prática recomendada noDesign de aplicativo de 12 fatores.

informação relacionada