web-dev-qa-db-fra.com

Comment puis-je changer le format d'un message de journal Python par enregistreur?

Après avoir lu le documentation sur logging , je sais que je peux utiliser du code comme celui-ci pour effectuer une journalisation simple:

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

Cependant, je me suis rendu compte que je ne savais pas comment modifier le format des messages de journal par enregistreur, puisque basicConfig est une fonction au niveau du module. Ce code fonctionne pour créer différents enregistreurs avec différents niveaux, noms, etc., mais existe-t-il un moyen de modifier le format de ces messages de journal également par enregistreur, d'une manière similaire à 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()
31
Ricardo Altamirano

Essaye ça

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

Voir http://docs.python.org/howto/logging-cookbook.html#multiple-handlers-and-formatters pour plus d'informations

55
Pavel Reznikov

Vous devez créer ou utiliser une sous-classe existante de logging.Handler Et appeler la méthode setformatter() d'une de ses instances avec une instance d'une sous-classe personnalisée de logger.Formatter. Si vous définissez le formateur pour un gestionnaire qui était déjà attaché à l'enregistreur dont vous souhaitez modifier la sortie, tout va bien, sinon vous devez récupérer un objet de l'enregistreur avec logging.getLogger() et appeler sa fonction addHandler() méthode avec l'instance de votre classe de gestionnaire sur laquelle vous définissez le formateur comme argument.

1
Silas Ray