2012-07-20 7 views
20

Después de leer el documentation on logging, sé que puedo usar un código como éste para llevar a cabo el registro sencillo:¿Cómo cambio el formato de un mensaje de registro de Python por registrador?

import logging 

def main(): 
    logging.basicConfig(filename="messages.log", 
         level=logging.WARNING, 
         format='%(filename)s: '  
           '%(levelname)s: ' 
           '%(funcName)s(): ' 
           '%(lineno)d:\t' 
           '%(message)s') 

    logging.debug("Only for debug purposes\n") 
    logging.shutdown() 

main() 

Sin embargo, me di cuenta de que no sé cómo cambiar el formato de los mensajes de registro en una base por-logger , ya que basicConfig es una función de nivel de módulo. Este código funciona para crear diferentes registradores con diferentes niveles, nombres, etc. pero, ¿hay alguna manera de cambiar el formato de esos mensajes de registro también por registrador, de una manera similar a basicConfig?

import inspect 
import logging 

def function_logger(level=logging.DEBUG): 
    function_name = inspect.stack()[1][3] 
    logger = logging.getLogger(function_name) 
    logger.setLevel(level) 
    logger.addHandler(logging.FileHandler("{0}.log".format(function_name))) 
    return logger 

def f1(): 
    f1_logger = function_logger() 
    f1_logger.debug("f1 Debug message") 
    f1_logger.warning("f1 Warning message") 
    f1_logger.critical("f1 Critical message") 

def f2(): 
    f2_logger = function_logger(logging.WARNING) 
    f2_logger.debug("f2 Debug message") 
    f2_logger.warning("f2 Warning message") 
    f2_logger.critical("f2 Critical message") 

def main(): 
    f1() 
    f2() 
    logging.shutdown() 

main() 

Respuesta

31

probar este

import logging 

logger = logging.getLogger('simple_example') 
logger.setLevel(logging.DEBUG) 
# create file handler that logs debug and higher level messages 
fh = logging.FileHandler('spam.log') 
fh.setLevel(logging.DEBUG) 
# create console handler with a higher log level 
ch = logging.StreamHandler() 
ch.setLevel(logging.ERROR) 
# create formatter and add it to the handlers 
formatter = logging.Formatter(
    '%(asctime)s - %(name)s - %(levelname)s - %(message)s') 
ch.setFormatter(formatter) 
fh.setFormatter(formatter) 
# add the handlers to logger 
logger.addHandler(ch) 
logger.addHandler(fh) 

# 'application' code 
logger.debug('debug message') 
logger.info('info message') 
logger.warn('warn message') 
logger.error('error message') 
logger.critical('critical message') 

Ver http://docs.python.org/howto/logging-cookbook.html#multiple-handlers-and-formatters para más información

+0

1, +1 y otra vez (por desgracia no) para añadir el código. Lo edité en mi [respuesta anterior] (http://stackoverflow.com/a/11581118/869912) a una pregunta de registro también, y funciona perfectamente. –

+9

Siempre me sorprende que no sea tan simple como 'logger = logging.getLogger ('mylogger') logger.basicConfig (level = ..., format = ...)' ... – theartofrain

+0

¡Funciona muy bien! ¡Gracias! – Eli

1

usted tiene que crear o utilizar una subclase existente de logging.Handler y llame al método de una instancia setformatter() del mismo con una instancia de una subclase personalizada de logger.Formatter. Si configura el formateador para un controlador que ya estaba conectado al registrador del que desea modificar la salida, está bien; de lo contrario, debe recuperar un objeto logger con logging.getLogger() y llamar a su método addHandler() con la instancia de su clase de controlador que configura el formateador como el argumento.

Cuestiones relacionadas