Estou usando o módulo de log do Python para registrar algumas seqüências de depuração em um arquivo que funciona muito bem. Agora, além disso, eu gostaria de usar este módulo para também imprimir as strings no stdout. Como eu faço isso? Para registrar minhas seqüências de caracteres em um arquivo, use o seguinte código:
import logging
import logging.handlers
logger = logging.getLogger("")
logger.setLevel(logging.DEBUG)
handler = logging.handlers.RotatingFileHandler(
LOGFILE, maxBytes=(1048576*5), backupCount=7
)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)
e chame uma função de logger como
logger.debug("I am written to the file")
Obrigado por alguma ajuda aqui!
StreamHandler
comsys.stdout
e, em seguida, ele registrará isso em vez de stderr.import sys
primeiro. E, na verdade inicializar o manipulador, ou sejaconsoleHandler = logging.StreamHandler(sys.stdout)
rootLogger.setLevel(logging.DEBUG)
que você está tentando ver informações de depuração ou mensagenslogging.basicConfig()
pode usar um argumento de palavra-chavehandlers
desde o Python 3.3, o que simplifica muito a configuração do registro, especialmente ao configurar vários manipuladores com o mesmo formatador:Toda a configuração pode, portanto, ser feita com uma única chamada como esta:
(Ou com
import sys
+ deStreamHandler(sys.stdout)
acordo com os requisitos da pergunta original - o padrão para o StreamHandler é gravar no stderr. Observe os atributos LogRecord se você quiser personalizar o formato do log e adicionar itens como nome do arquivo / linha, informações do encadeamento etc.)A configuração acima precisa ser feita apenas uma vez perto do início do script. Você pode usar o log de todos os outros lugares na base de código posteriormente, desta forma:
Nota: Se não funcionar, provavelmente alguém já inicializou o sistema de registro de maneira diferente. Comentários sugerem fazer
logging.root.handlers = []
antes da chamada parabasicConfig()
.fonte
FileHandler
:logging.FileHandler(filename, mode='a', encoding=None, delay=False)
. Isso significa que, quando você quiser fazer login na mesma pasta, poderá usarFileHandler("mylog.log")
. Se você deseja substituir o log toda vez, defina "w" como o segundo argumento.logging.root.handlers = []
antes da chamadabasicConfig
, dê uma olhada na função - é irritante.Adicionar um StreamHandler sem argumentos vai para stderr em vez de stdout. Se algum outro processo tiver uma dependência do dump do stdout (por exemplo, ao escrever um plug-in NRPE), certifique-se de especificar o stdout explicitamente ou poderá haver problemas inesperados.
Aqui está um exemplo rápido reutilizando os valores assumidos e LOGFILE da pergunta:
fonte
Execute
basicConfig
comstream=sys.stdout
o argumento anterior à configuração de qualquer outro manipulador ou registre qualquer mensagem ou adicione manualmente umStreamHandler
que envia mensagens para stdout ao registrador raiz (ou qualquer outro registrador desejado, nesse sentido).fonte
Depois de ter usado o código de Waterboy repetidamente em vários pacotes Python, finalmente o converti em um pequeno pacote Python autônomo, que você pode encontrar aqui:
https://github.com/acschaefer/duallog
O código está bem documentado e fácil de usar. Basta baixar o
.py
arquivo e incluí-lo no seu projeto ou instalar o pacote inteiro viapip install duallog
.fonte
Registrando em
stdout
erotating file
com diferentes níveis e formatos:fonte
Aqui está uma solução completa e bem organizada, com base na resposta de Waterboy e em várias outras fontes. Ele suporta o log no console e no arquivo de log, permite diferentes configurações no nível do log, fornece saída colorida e é facilmente configurável (também disponível como Gist ):
fonte
Para 2.7, tente o seguinte:
fonte