2011-11-08 21 views
19

Quiero verificar los errores en un archivo de fondo particular, pero el flujo de error estándar está siendo controlado por el programa en primer plano y los errores en el archivo en la pregunta no son siendo mostrado. Sin embargo, puedo usar el módulo logging y escribir salida en un archivo. Me preguntaba cómo puedo usar esto para registrar todas las excepciones, errores y sus seguimientos.Usando el módulo de registro de Python para registrar todas las excepciones y errores

+0

Posible duplicado de [Registro de excepciones no capturadas en Python] (http://stackoverflow.com/questions/6234405/logging-uncaught-exceptions-in-python) –

Respuesta

40

Probablemente sea una mala idea registrar cualquier excepción lanzada dentro del programa, ya que Python usa excepciones también para el flujo de control normal.

Por lo tanto, solo debe registrar excepciones no detectadas. Puede hacerlo fácilmente usando el registrador exception() method, una vez que tenga un objeto de excepción.

para manejar todas las excepciones no capturadas, puede envolver punto de entrada de la escritura en un bloque try...except, o mediante la instalación de un controlador de excepción personalizada por la re-asignación de sys.excepthook():

import logging 
import sys 

logger = logging.getLogger('mylogger') 
# Configure logger to write to a file... 

def my_handler(type, value, tb): 
    logger.exception("Uncaught exception: {0}".format(str(value))) 

# Install exception handler 
sys.excepthook = my_handler 

# Run your main script here: 
if __name__ == '__main__': 
    main() 
+0

¡Gracias! Esto es exactamente lo que necesitaba. –

+0

¿No es buena idea agregar 'sys .__ excepthook __ (tipo, valor, tb)' a su 'my_handler', por lo que puede procesar acciones predeterminadas en caso de excepción? – troyane

+2

@Ferdinand Beyer: ordenado. Tener 'logger.exception (" excepción no detectada: {0}: {1} ". Format (str (value .__ class __.__ name__), str (value)))' da en mi caso 'ERROR - excepción no detectada: IndexError: list index out of range' e imprime por alguna razón 'None'. ¿Cómo también obtengo el rastreo completo? 'tb' parece ser un objeto de rastreo, pero' traceback.print_tb (tb) 'también escupe' None'. – bioslime

Cuestiones relacionadas