2012-07-20 18 views
20

Dopo aver letto il documentation on logging, so che posso utilizzare il codice come questo per eseguire la registrazione semplice:Come si modifica il formato di un messaggio di registro Python su base per-logger?

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() 

Tuttavia, ho capito che non so come cambiare il formato dei messaggi di log su una base per-logger , dal basicConfig è una funzione a livello di modulo. Questo codice funziona per creare diversi logger con diversi livelli, nomi, ecc., Ma c'è un modo per cambiare il formato di questi messaggi di log anche su base per-logger, in un modo simile 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() 

risposta

31

Prova questa

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') 

Vedi http://docs.python.org/howto/logging-cookbook.html#multiple-handlers-and-formatters per ulteriori informazioni

+0

+1, +1 e ancora una volta (purtroppo no) per l'aggiunta del codice. L'ho modificato nella mia [risposta precedente] (http://stackoverflow.com/a/11581118/869912) a una domanda di registrazione, e funziona perfettamente. –

+9

Sono sempre sorpreso che non sia così semplice come logger = logging.getLogger ('mylogger') logger.basicConfig (level = ..., format = ...) '... – theartofrain

+0

Funzionante alla grande! Grazie! – Eli

1

è necessario creare o utilizzare una sottoclasse esistente di logging.Handler e chiamare il metodo di un'istanza setformatter() esso con un'istanza di una sottoclasse personalizzata di logger.Formatter. Se si imposta il formattatore per un gestore che era già collegato al registratore di cui si desidera modificare l'output, si sta andando bene, altrimenti si deve recuperare un oggetto logger con logging.getLogger() e chiamare il suo metodo addHandler() con l'istanza della classe del gestore che imposti il ​​formattatore come argomento.

Problemi correlati