2015-02-23 1 views
4

J'essaie de créer un enregistreur non-root dans un module enfant python en utilisant logging.getLogger ('child'), mais j'obtiens une erreur "Aucun gestionnaire ne peut find pour logger "child"Comment créer un enregistreur non-racine en python

J'essaie d'avoir un module parent dans le fichier journal parent Le module parent va créer des instances du module enfant, et je veux que le module enfant écrit son propre fichier journal enfant ., sans propager ses messages jusqu'à le fichier journal parent

Voici ce que j'ai pour le module parent (ce qui est exécuté par l'utilisateur):

#!/usr/bin/env python 

import logging, child 

logging.basicConfig(filename='parent.log') 
logging.warning('test log from parent') 

c = child.run() 

Et voici le module enfant:

import logging 
class run: 
    def __init__(self): 
    logging.basicConfig(filename = 'child.log') 
    childLogger = logging.getLogger(__name__) 
    childLogger.propagate = False 
    childLogger.warning('this is a log from the child') 

sortie prévue est d'avoir 2 fichiers: parent.log (contenant la 1 ligne d'avertissement du module parent) et child.log (contenant une WARNING ligne de la module enfant).

La sortie réelle est: une ligne WARNING (du parent) est imprimée dans le fichier parent.log, et il n'y a pas de fichier child.log - le message du journal enfant n'est enregistré nulle part.

Pouvez-vous s'il vous plaît me dire ce que je manque? TIA!

Répondre

3

Remplacer

logging.basicConfig(filename='child.log') 
childLogger = logging.getLogger(__name__) 

dans votre module enfant:

childLogger = logging.getLogger(__name__) 
childLogger.addHandler(logging.FileHandler('child.log')) 

ou bien, utilisez dictConfig ou fileConfig pour configurer l'enregistrement en un seul endroit.

Qu'est-ce qui ne va pas avec basicConfig? À partir des documents:

Cette fonction ne fait rien si le gestionnaire de racine a déjà des gestionnaires configurés pour cela.

Donc, en gros, votre appel à basicLogging dans le module enfant n'a pas d'effet, depuis le premier (dans le module parent) a déjà configuré l'enregistreur racine. Et en définissant le propagate du consignateur enfant à false, les entrées du journal de l'enfant ne sont pas transmises au consignateur racine, vous obtenez donc l'avertissement No handlers could be found....

Modifier

Juste pour élaborer sur fileConfig, ce qui permet une grande flexibilité pour vos modules, vous pouvez créer un fichier appelé logging.ini:

[loggers] 
keys=root,child 

[handlers] 
keys=logfile,logfile_child 

[formatters] 
keys=default 

# loggers 

[logger_root] 
level=INFO 
handlers=logfile 

[logger_child] 
level=INFO 
handlers=logfile_child 
qualname=child 
propagate=0 

# handlers 

[handler_logfile] 
class=FileHandler 
formatter=default 
args=('parent.log',) 

[handler_logfile_child] 
class=FileHandler 
formatter=default 
args=('child.log',) 

# formatters 

[formatter_default] 
format=%(asctime)s [%(module)s:%(lineno)d] %(levelname)s %(message)s 
datefmt= 

Ensuite, quelque part dans votre application, vous aurait juste besoin d'appeler fileConfig:

import logging.config 

logging.config.fileConfig('logging.ini') 

T De cette façon, votre journalisation est configurée en un seul endroit, ce qui rend plus facile l'ajout d'enregistreurs supplémentaires, la modification des niveaux de journaux, etc.