Estou imprimindo mensagens de exceção do Python em um arquivo de log com logging.error
:
import logging
try:
1/0
except ZeroDivisionError as e:
logging.error(e) # ERROR:root:division by zero
É possível imprimir informações mais detalhadas sobre a exceção e o código que a gerou do que apenas a cadeia de exceção? Coisas como números de linhas ou traços de pilha seriam ótimos.
python
exception
logging
exception-handling
provavelmente na praia
fonte
fonte
exception
método simplesmente chamaerror(message, exc_info=1)
. Assim que você passarexc_info
para qualquer um dos métodos de log de um contexto de exceção, receberá um retorno.sys.excepthook
(veja aqui ) para evitar a necessidade de agrupar todo o seu código em try / except.except Exception:
porque você não está usandoe
de qualquer maneira;)e
ao tentar depurar interativamente seu código. :) É por isso que eu sempre o incluo.raise
no final doexcept
escopo. Caso contrário, a execução continuará como se estivesse tudo bem.Uma coisa agradável sobre
logging.exception
que resposta de SiggyF não mostra é que você pode passar uma mensagem arbitrária, e registro ainda vai mostrar o rastreamento completo com todos os detalhes de exceção:Com o comportamento de registro padrão (nas versões recentes) de apenas erros de impressão
sys.stderr
, fica assim:fonte
''
se você realmente não quiser digitar uma mensagem ... a função não pode ser chamada sem pelo menos um argumento, no entanto, então você terá que fornecer algo.O uso de
exc_info
opções pode ser melhor para permitir que você escolha o nível de erro (se você usarexception
, ele sempre estará noerror
nível):fonte
logging.fatal
um método na biblioteca de log? Eu só vejocritical
.critical
, assim comowarn
éwarning
.Citação
Agora,
traceback
pode ser usado aqui.Use-o no Python 2 :
Use-o no Python 3 :
fonte
ex_traceback
é deex.__traceback__
sob Python 3, masex_traceback
é desys.exc_info()
sob Python 2.Se você usar os logs simples - todos os seus registros de log deve corresponder esta regra:
one record = one line
. Seguindo essa regra, você pode usargrep
e outras ferramentas para processar seus arquivos de log.Mas as informações de rastreamento são multilinhas. Portanto, minha resposta é uma versão estendida da solução proposta por zangw acima neste tópico. O problema é que as linhas de traceback podem ter
\n
dentro, então precisamos fazer um trabalho extra para nos livrar dos finais dessa linha:Depois disso (quando estiver analisando seus logs), você poderá copiar / colar as linhas de retorno necessárias do seu arquivo de log e fazer o seguinte:
Lucro!
fonte
Essa resposta se baseia nas excelentes acima.
Na maioria dos aplicativos, você não estará chamando logging.exception (e) diretamente. Provavelmente você definiu um criador de logs personalizado específico para seu aplicativo ou módulo como este:
Nesse caso, basta usar o logger para chamar a exceção (e) assim:
fonte
Você pode registrar o rastreamento de pilha sem uma exceção.
https://docs.python.org/3/library/logging.html#logging.Logger.debug
Exemplo:
fonte
Um pouco de tratamento decorador (muito vagamente inspirado na mônada e no levantamento do Talvez). Você pode remover com segurança as anotações do tipo Python 3.6 e usar um estilo de formatação de mensagens mais antigo.
fallible.py
Demo:
Você também pode modificar esta solução para retornar algo um pouco mais significativo do que
None
aexcept
parte (ou até tornar a solução genérica, especificando esse valor de retorno nosfallible
argumentos de).fonte
No seu módulo de registro (se módulo personalizado), apenas ative o stack_info.
fonte
Se você pode lidar com a dependência extra e usar o twisted.log, não precisará registrar explicitamente os erros e também devolverá todo o tempo de rastreamento e hora ao arquivo ou fluxo.
fonte
twisted
seja uma boa recomendação, mas essa resposta realmente não contribui muito. Ele não diz como usartwisted.log
, nem quais vantagens ele tem sobre ologging
módulo da biblioteca padrão, nem explica o que significa "você não precisa registrar erros explicitamente" .Uma maneira limpa de fazer isso é usando
format_exc()
e analisar a saída para obter a parte relevante:Saudações
fonte
.split('\n')[-2]
faz é jogar fora o número da linha e o retorno do resultado deformat_exc()
- informações úteis que você normalmente deseja! Além do mais, ele nem faz um bom trabalho nisso ; se sua mensagem de exceção contiver uma nova linha, essa abordagem imprimirá apenas a linha final da mensagem de exceção - o que significa que você perde a classe de exceção e a maior parte da mensagem de exceção, além de perder o traceback. -1.