Python registrando vários arquivos
-
19-09-2019 - |
Pergunta
Eu li a documentação do módulo de registro e, embora eu tenha perdido algo óbvio, o código que tenho não parece estar funcionando como pretendido. Estou usando o Python 2.6.4.
Meu programa consiste em vários arquivos Python diferentes, dos quais quero enviar mensagens de log para um arquivo de texto e, potencialmente, a tela. Eu imagino que isso é uma coisa comum a fazer, então estou estragando isso em algum lugar.
O que meu código está fazendo no minuto está registrando o arquivo de texto corretamente, meio. Mas o log na tela está sendo duplicado, um com a formatação especificada e outra sem. Além disso, quando desligo a saída da tela, ainda estou imprimindo o texto uma vez, o que não quero - só quero que seja registrado no arquivo.
Enfim, algum código:
#logger.py
import logging
from logging.handlers import RotatingFileHandler
import os
def setup_logging(logdir=None, scrnlog=True, txtlog=True, loglevel=logging.DEBUG):
logdir = os.path.abspath(logdir)
if not os.path.exists(logdir):
os.mkdir(logdir)
log = logging.getLogger('stumbler')
log.setLevel(loglevel)
log_formatter = logging.Formatter("%(asctime)s - %(levelname)s :: %(message)s")
if txtlog:
txt_handler = RotatingFileHandler(os.path.join(logdir, "Stumbler.log"), backupCount=5)
txt_handler.doRollover()
txt_handler.setFormatter(log_formatter)
log.addHandler(txt_handler)
log.info("Logger initialised.")
if scrnlog:
console_handler = logging.StreamHandler()
console_handler.setFormatter(log_formatter)
log.addHandler(console_handler)
Nada incomum lá.
#core.py
import logging
corelog = logging.getLogger('stumbler.core') # From what I understand of the docs, this should work :/
class Stumbler:
[...]
corelog.debug("Messages and rainbows...")
A saída da tela mostra como isso está sendo duplicado:
2010-01-08 22:57:07,587 - DEBUG :: SCANZIP: Checking zip contents, file: testscandir/testdir1/music.mp3
DEBUG:stumbler.core:SCANZIP: Checking zip contents, file: testscandir/testdir1/music.mp3
2010-01-08 22:57:07,587 - DEBUG :: SCANZIP: Checking zip contents, file: testscandir/testdir2/subdir/executable.exe
DEBUG:stumbler.core:SCANZIP: Checking zip contents, file: testscandir/testdir2/subdir/executable.exe
Embora o TextFile esteja obtendo a saída formatada corretamente, desligando o logs da tela no logger.py ainda possui a saída formatada incorretamente exibida.
Pelo que entendi dos documentos, chamando o Corelog.debug (), visto que o Corelog é um filho do Logger "Stumbler", ele deve usar essa formatação e saída dos logs como tal.
Desculpas pelo ensaio por uma questão tão trivial.
TL; DR: Como faço o log de vários arquivos?
Solução
Você tem certeza de que nenhuma outra configuração de registro está sendo feita em qualquer coisa que você importe.
A saída incorreta em seus logs de console parece a configuração padrão para um logger, para que algo mais possa estar configurando isso.
Executa este script de teste rápido:
import logging
from logging.handlers import RotatingFileHandler
import os
def setup_logging(logdir=None, scrnlog=True, txtlog=True, loglevel=logging.DEBUG):
logdir = os.path.abspath(logdir)
if not os.path.exists(logdir):
os.mkdir(logdir)
log = logging.getLogger('stumbler')
log.setLevel(loglevel)
log_formatter = logging.Formatter("%(asctime)s - %(levelname)s :: %(message)s")
if txtlog:
txt_handler = RotatingFileHandler(os.path.join(logdir, "Stumbler.log"), backupCount=5)
txt_handler.doRollover()
txt_handler.setFormatter(log_formatter)
log.addHandler(txt_handler)
log.info("Logger initialised.")
if scrnlog:
console_handler = logging.StreamHandler()
console_handler.setFormatter(log_formatter)
log.addHandler(console_handler)
setup_logging('/tmp/logs')
corelog = logging.getLogger('stumbler.core')
corelog.debug("Messages and rainbows...")
produz este resultado:
2010-01-08 15: 39: 25.335-Debug :: Mensagens e arco-íris ...
E no meu /tmp/logs/stumbler.log
2010-01-08 15: 39: 25.335-Info :: Logger inicializado. 2010-01-08 15: 39: 25.335-Debug :: Mensagens e arco-íris ...
Isso funcionou como esperado quando eu o executei em Python 2.4, 2.5 e 2.6.4