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