Não consigo entender o logging
módulo do Python . Minhas necessidades são muito simples: eu só quero registrar tudo no syslog. Depois de ler a documentação, criei este script de teste simples:
import logging
import logging.handlers
my_logger = logging.getLogger('MyLogger')
my_logger.setLevel(logging.DEBUG)
handler = logging.handlers.SysLogHandler()
my_logger.addHandler(handler)
my_logger.debug('this is debug')
my_logger.critical('this is critical')
Mas esse script não produz nenhum registro de log no syslog. O que há de errado?
Respostas:
Mude a linha para isto:
Isso funciona para mim
fonte
'/var/run/syslog'
é a coisa certa no OS X.logging.Formatter(fmt='myscriptname[%(process)d]: %(levelname)s: %(message)s', ...)
, uma condição rsyslog como$programname == 'myscriptname'
funciona.Você sempre deve usar o host local para o log, seja para / dev / log ou localhost através da pilha TCP. Isso permite que o daemon de log do sistema totalmente compatível com RFC e com recursos processe o syslog. Isso elimina a necessidade do daemon remoto ser funcional e fornece os recursos aprimorados dos daemon syslog, como rsyslog e syslog-ng, por exemplo. A mesma filosofia vale para o SMTP. Basta entregá-lo ao software SMTP local. Nesse caso, use o 'modo de programa' não o daemon, mas é a mesma ideia. Deixe o software mais capaz lidar com isso. Repetir, enfileirar, colocar em spool local, usando TCP em vez de UDP para syslog e assim por diante tornam-se possíveis. Você também pode [re] configurar esses daemons separadamente do seu código, como deveria ser.
Salve sua codificação para a sua aplicação, deixe que outros softwares façam seu trabalho em conjunto.
fonte
Encontrei o módulo syslog para facilitar o comportamento básico de registro que você descreve:
Também há outras coisas que você poderia fazer, mas mesmo as duas primeiras linhas receberão o que você pediu, como eu o entendo.
fonte
Reunindo as coisas daqui e de outros lugares, é isso que eu criei que funciona no unbuntu 12.04 e centOS6
Crie um arquivo
/etc/rsyslog.d/
que termine em .conf e adicione o seguinte textoReinicie
rsyslog
, recarregar NÃO parecia funcionar para os novos arquivos de log. Talvez ele apenas recarregue os arquivos conf existentes?Em seguida, você pode usar este programa de teste para garantir que ele realmente funcione.
fonte
sudo service rsyslog restart
Acrescento um pequeno comentário extra, caso ajude alguém, porque achei essa troca útil, mas precisava desse pouco de informação extra para fazer tudo funcionar.
Para efetuar logon em um recurso específico usando o SysLogHandler, é necessário especificar o valor do recurso. Digamos, por exemplo, que você definiu:
local3.* /var/log/mylog
no syslog, convém usar:
handler = logging.handlers.SysLogHandler(address = ('localhost',514), facility=19)
e você também precisa ter o syslog escutando no UDP para usar o host local em vez de / dev / log.
fonte
Seu syslog.conf está configurado para manipular facilidade = usuário?
Você pode definir o recurso usado pelo criador de logs python com o argumento do recurso, algo como isto:
fonte
LOG_DAEMON
você fornece como um valor para ofacility
parâmetroSysLogHandler.LOG_DAEMON
.o script acima registrará na instalação LOCAL0 com nosso "LOG_IDENTIFIER" personalizado ... você pode usar LOCAL [0-7] para fins locais.
fonte
Em https://github.com/luismartingil/per.scripts/tree/master/python_syslog
fonte
Aqui está a maneira yaml dictConfig recomendada para 3.2 e posterior.
No log
cfg.yml
:Carregue a configuração usando:
Configurou o syslog e um arquivo direto. Observe que o
/dev/log
sistema operacional é específico.fonte
Eu conserto no meu notebook. O serviço rsyslog não ouviu no serviço de soquete.
Eu configurei esta linha abaixo no
/etc/rsyslog.conf
arquivo e resolvi o problema:$SystemLogSocketName /dev/log
fonte
Você também pode adicionar um manipulador de arquivos ou rotativo para enviar seus logs para um arquivo local: http://docs.python.org/2/library/logging.handlers.html
fonte