Estoy imprimiendo mensajes de excepción de Python en un archivo de registro con logging.error
:
import logging
try:
1/0
except ZeroDivisionError as e:
logging.error(e) # ERROR:root:division by zero
¿Es posible imprimir información más detallada sobre la excepción y el código que la generó que solo la cadena de excepción? Cosas como números de línea o trazos de pila serían geniales.
python
exception
logging
exception-handling
probablemente en la playa
fuente
fuente
exception
método simplemente llamaerror(message, exc_info=1)
. Tan pronto como paseexc_info
a cualquiera de los métodos de registro desde un contexto de excepción, obtendrá un rastreo.sys.excepthook
(ver aquí ) para evitar tener que ajustar todo su código en try / except.except Exception:
porque no estás usandoe
de ninguna manera;)e
cuando intente depurar interactivamente su código. :) Por eso siempre lo incluyo.raise
al final delexcept
alcance. De lo contrario, la ejecución continuará como si todo estuviera bien.Una cosa buena acerca de
logging.exception
que la respuesta de SiggyF no se muestra es que puede pasar un mensaje arbitrario, y el registro aún mostrará el rastreo completo con todos los detalles de la excepción:Con el comportamiento de registro predeterminado (en versiones recientes) de solo imprimir errores
sys.stderr
, se ve así:fuente
''
si realmente no quieres escribir un mensaje ... sin embargo, la función no se puede invocar sin al menos un argumento, por lo que tendrás que darle algo.El uso de
exc_info
opciones puede ser mejor, para permitirle elegir el nivel de error (si lo usaexception
, siempre estará en elerror
nivel):fuente
logging.fatal
un método en la biblioteca de registro? Solo veocritical
.critical
, al igual que lowarn
eswarning
.Citando
Ahora,
traceback
podría usarse aquí.Úselo en Python 2 :
Úselo en Python 3 :
fuente
ex_traceback
es deex.__traceback__
Python 3, peroex_traceback
es desys.exc_info()
Python 2.Si utiliza a logs - todos los registros de deben corresponder esta regla:
one record = one line
. Siguiendo esta regla, puede usargrep
y otras herramientas para procesar sus archivos de registro.Pero la información de rastreo es de varias líneas. Entonces mi respuesta es una versión extendida de la solución propuesta por zangw arriba en este hilo. El problema es que las líneas de rastreo pueden tener
\n
dentro, por lo que debemos hacer un trabajo adicional para deshacernos de estas terminaciones de línea:Después de eso (cuando analizará sus registros), podría copiar / pegar las líneas de rastreo requeridas desde su archivo de registro y hacer esto:
¡Lucro!
fuente
Esta respuesta se acumula a partir de las excelentes anteriores.
En la mayoría de las aplicaciones, no llamará a logging.exception (e) directamente. Lo más probable es que haya definido un registrador personalizado específico para su aplicación o módulo como este:
En este caso, simplemente use el registrador para llamar a la excepción (e) así:
fuente
Puede registrar el seguimiento de la pila sin una excepción.
https://docs.python.org/3/library/logging.html#logging.Logger.debug
Ejemplo:
fuente
Un poco de tratamiento de decorador (muy poco inspirado en la mónada tal vez y el levantamiento). Puede eliminar de forma segura las anotaciones de tipo Python 3.6 y usar un estilo de formato de mensaje anterior.
falible.py
Manifestación:
También puede modificar esta solución para devolver algo un poco más significativo que el
None
de laexcept
parte (o incluso hacer que la solución sea genérica, especificando este valor de retorno enfallible
los argumentos).fuente
En su módulo de registro (si es un módulo personalizado) simplemente habilite stack_info.
fuente
Si puede hacer frente a la dependencia adicional, use twisted.log, no tiene que registrar explícitamente los errores y también devuelve todo el rastreo y el tiempo al archivo o secuencia.
fuente
twisted
sea una buena recomendación, pero esta respuesta realmente no contribuye mucho. No dice cómo usartwisted.log
, ni qué ventajas tiene sobre ellogging
módulo de la biblioteca estándar, ni explica qué significa "no tiene que registrar explícitamente los errores" .Una forma limpia de hacerlo es usar
format_exc()
y luego analizar la salida para obtener la parte relevante:Saludos
fuente
.split('\n')[-2]
hace es tirar el número de línea y rastrear el resultado deformat_exc()
- ¡información útil que normalmente desea! Lo que es más, ni siquiera hace un buen trabajo de eso ; si su mensaje de excepción contiene una nueva línea, entonces este enfoque solo imprimirá la línea final del mensaje de excepción, lo que significa que pierde la clase de excepción y la mayor parte del mensaje de excepción además de perder el rastreo. -1.