Saída de log de mais de um script

0

Eu tenho um problema com relação ao registro de um processo:

  • Eu tenho 3 scripts, a.py, b.py e c.sh
  • a.py chama b.py e b.py chama c.sh

O objetivo é registrar continuamente / errar (gravar no arquivo e no console)

Atualmente, estou tentando iniciar o script inicial assim:

python -u a.py 2>&1 | tee logfile.txt

Agora o problema é que a saída do c.sh só é impressa / registrada uma vez que o b.py terminou completamente sua execução, mas eu prefiro que ele esteja ativo (todas as linhas do c.sh não aparecem uma após a outra, todos eles aparecem juntos depois que todo o processo é concluído).

Existe uma maneira melhor de registrar ou eu alcanço isso de alguma forma?

    
por RandomDisplayName 30.04.2015 / 13:08

1 resposta

3
Pessoalmente, acredito que uma das primeiras coisas que você precisa fazer em um script ou aplicativo de linha de comando é configurar um sistema de registro. Apenas com algumas linhas reutilizáveis, você pode fazer o log em todos os seus aplicativos python e até usar diferentes níveis de depuração:).

Eu não basearia o registro em log na gravação de arquivos com o tee, apenas registrasse no stdout e no seu canal de registro. Eu estou supondo que você pode modificar seus scripts python, tudo abaixo se aplica a essa situação. ( desloque-se para o "usando a resposta tee" :).

Em Python, você pode usar o módulo Logging (verifique o Logging HOWTO na documentação oficial do Python: link ) mas, infelizmente, processos diferentes não podem gravar no mesmo arquivo (diferentes linhas do mesmo processo podem).

Então, neste caso, você está descrevendo, eu acho que o caso base será o log para o syslog, seja com a biblioteca de log, ou com a biblioteca Syslog ( link ).

Você pode logar no recurso local0. * do syslog em todos os aplicativos e deixar que o syslog (rsyslog no meu caso) grave no arquivo:

local0.*                /var/log/myapp.log

O melhor deste sistema é que você pode até mesmo fazer login em servidores syslog remotos em máquinas diferentes, não apenas na execução dos aplicativos.

PS: Não se esqueça de definir uma política de /etc/logrotate.d/myapp para girar seus arquivos de registro de aplicativos!

A opção tee

Se você ainda precisa usar tee , tentou usar o sinal -a para o segundo e terceiro processo? Conforme declarado no link :

The tee ( 13.9 ) command writes its standard input to a file and writes the same text to its standard output. You might want to collect several commands' output and tee them all to the same file, one after another. The obvious way to do that is with the -a option

$ some-command | tee teefile

$ another-command | tee -a teefile

$ a-third-command | tee -a teefile

    
por 30.04.2015 / 16:07