2012-07-20 14 views
20

Po przeczytaniu documentation on logging, wiem, że mogę użyć kodu tak, aby wykonać proste rejestrowanie:Jak zmienić format wiadomości dziennika Pythona dla każdego rejestratora?

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

jednak zdałem sobie sprawę, nie wiem jak zmienić format komunikatów dziennika na podstawie na rejestratorze , ponieważ basicConfig jest funkcją na poziomie modułu. Ten kod służy do tworzenia różnych rejestratorów o różnych poziomach, nazwach itp., Ale czy istnieje sposób na zmianę formatu tych komunikatów dziennika na podstawie każdego rejestratora, w sposób podobny do 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() 

Odpowiedz

31

Spróbuj

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

Zobacz http://docs.python.org/howto/logging-cookbook.html#multiple-handlers-and-formatters więcej informacji

+0

+1, +1 i ponownie (niestety nie) do dodawania kodu. Zmieniłem to również w mojej [poprzedniej odpowiedzi] (http://stackoverflow.com/a/11581118/869912) na pytanie dotyczące rejestrowania i działa idealnie. –

+9

Zawsze jestem zaskoczony, że nie jest tak prosty, jak 'logger = logging.getLogger ('mylogger') logger.basicConfig (level = ..., format = ...)' ... – theartofrain

+0

Działa świetnie! Dzięki! – Eli

1

Musisz utworzyć lub użyć istniejącego podklasy logging.Handler i wywołać metodę instancji setformatter() jej z instancją niestandardowej podklasy logger.Formatter. Jeśli ustawisz formatter dla programu obsługi, który był już dołączony do programu rejestrującego, który chcesz zmodyfikować wyjście, w porządku, w przeciwnym razie musisz odzyskać obiekt rejestratora za pomocą logging.getLogger() i wywołać jego metodę addHandler() za pomocą instancji klasy obsługi, która ustawiasz formatator jako argument.

Powiązane problemy