Usando el módulo de registro de python para registrar todas las excepciones y errores

I want to check for errors in a particular background file, but the standard error stream is being controlled by the program in the foreground and the errors in the file in the question are not being displayed. I can use the logging module and write output to a file, though. I was wondering how I can use this to log all exceptions, errors and their tracebacks.

preguntado el 08 de noviembre de 11 a las 13:11

2 Respuestas

It's probably a bad idea to log cualquier exception thrown within the program, since Python uses exceptions also for normal control flow.

Therefore you should only log no atrapado exceptions. You can easily do this using a logger's exception() Método, once you have an exception object.

To handle all uncaught exceptions, you can either wrap your script's entry point in a try...except block, or by installing a custom exception handler by re-assigning 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()

respondido 08 nov., 11:20

Isn't that good idea to append sys.__excepthook__(type, value, tb) para usted my_handler, so it can process default actions on exception? - creer

@Ferdinand Beyer: Neat. Having logger.exception("Uncaught exception: {0}: {1}".format(str(value.__class__.__name__), str(value))) gives in my case ERROR - Uncaught exception: IndexError: list index out of range and prints for some reason None. How do i also get the full traceback? tb seems to be a traceback object but traceback.print_tb(tb) also just spits out None. - bioslima

@bioslime see esta receta que se basa en el exc_info kwarg to log the traceback, too. It seems to only work with logger.error or logger.critical, pero no con logger.exception. - j08lue

The above code does not work for me. Replacing main() con hello ==== "Hello" still results in a stack trace being printed to the console. - cclauss

I prefer this answer too:stackoverflow.com/a/16993115/512111 - Zhou Hongbo

import sys
import logging
import traceback

# log uncaught exceptions
def log_exceptions(type, value, tb):
    for line in traceback.TracebackException(type, value, tb).format(chain=True):
        logging.exception(line)
    logging.exception(value)

    sys.__excepthook__(type, value, tb) # calls default excepthook

sys.excepthook = log_exceptions

Respondido 08 Jul 21, 02:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.