Estoy usando AWS y uso AWS cloudwatch para ver registros. Si bien las cosas no deberían fallar en AWS, podrían hacerlo. Acabo de tener un caso así. Luego busqué Traceback y obtuve las líneas
Traceback (most recent call last):sin el rastreo real. Tengo una configuración de registro estructurado que funciona (ver otra pregunta ) y me gustaría obtener rastreos de manera similar.
Así que en lugar de:
Traceback (most recent call last): File "/home/math/Desktop/test.py", line 32, in <module> adf NameError: name 'adf' is not definedalgo como
{"message": "Traceback (most recent call last):\n File \"/home/math/Desktop/test.py\", line 32, in <module>\n adf\n NameError: name 'adf' is not defined", "lineno": 35, "pathname": "/home/math/Desktop/test.py"}o incluso mejor también con la cadena en formato JSON.
La única forma de lograr esto que se me ocurre es un bloque gigante de prueba y excepción. Al estilo Pokémon. ¿Hay una solución mejor?
Puede usar sys.excepthook . Se invoca cada vez que ocurre una excepción en su secuencia de comandos.
import logging import sys import traceback def exception_logging(exctype, value, tb): """ Log exception by using the root logger. Parameters ---------- exctype : type value : NameError tb : traceback """ write_val = {'exception_type': str(exctype), 'message': str(traceback.format_tb(tb, 10))} logging.exception(str(write_val)) Luego, en su secuencia de comandos, debe anular el valor de sys.excepthook .
sys.excepthook = exception_loggingAhora, cada vez que ocurra una excepción, se registrará con su controlador de registro.
Nota: No olvide configurar el registrador antes de ejecutar esto
En caso de que alguien quiera que la excepción se registre en su formato predeterminado, pero en una línea (por cualquier motivo), según la respuesta aceptada:
def exception_logging(exctype, value, tb): """ Log exception in one line by using the root logger. Parameters ---------- exctype : exception type value : seems to be the Exception object (with its message) tb : traceback """ logging.error(''.join(traceback.format_exception(exctype, value, tb))) Tenga en cuenta también que utiliza logging.error() en lugar de logging.exception(), que también imprimió una línea adicional "NoneType: None".
También tenga en cuenta que solo parece funcionar con excepciones no detectadas.
Para registrar excepciones detectadas, visite ¿Cómo puedo dar formato a los seguimientos de pila de excepciones en el registro de Python? y ver también mi respuesta.
Una ligera variación: si ejecuta una aplicación Flask, puede hacer esto:
@app.errorhandler(Exception) def exception_logger(error): """Log the exception.""" logger.exception(str(error)) return str(error)