2017-05-25 4 views
15

Je suis novice à python. J'essayais de me connecter en python et je suis tombé dessus Aucun gestionnaire n'a pu être trouvé pour l'erreur logger en essayant d'imprimer un avertissement via l'instance de l'enregistreur. Voici le code que j'ai essayéAucun gestionnaire n'a pu être trouvé pour logger

import logging 
logger=logging.getLogger('logger') 
logger.warning('The system may break down') 

Et je reçois cette erreur Aucun gestionnaire n'a pu être trouvée pour enregistreur « enregistreur »

Qu'est-ce qui me confondant est quand je tente d'imprimer avertissement à l'aide logging puis par logger, il fonctionne très bien, comme

>>> import logging 
>>> logging.warning('This is a WARNING!!!!') 
WARNING:root:This is a WARNING!!!! 
>>> 
>>> logger.warning('WARNING!!!!') 
WARNING:logger:WARNING!!!! 

quelqu'un peut-il jeter un peu de lumière sur ce qui se passe dans le deuxième scénario?

+0

question Pour votre information similaire avec plus upvotes https://stackoverflow.com/questions/345991/python-no-handlers-could-be-found-for-logger-opengl -error –

Répondre

3

pour se connecter à travers un certain message logger, dans le python au moins un gestionnaire doit être ajouté à l'objet logger. Par défaut le debug, warn et d'autres fonctions dans le module logging appelleront basicConfig qui à son tour va ajouter un StreamHandler au root logger.

Il est toujours recommended d'ajouter votre gestionnaire requis à votre objet de journal que vous écrivez pour votre module.

Vous pouvez vous référer à official Python docs, qui a un awesome tutorial ou vous pouvez mieux vérifier le code source du module de connexion vous-même.

simplement vous pouvez vérifier la source en Python lui-même shell par,

import logging 
import inspect 
print(inspect.getsource(logging)) 
22

appel logging.basicConfig():

>>> import logging 
>>> logging.basicConfig() 
>>> logger = logging.getLogger('logger') 
>>> logger.warning('The system may break down') 
WARNING:logger:The system may break down 
+0

Merci pour le partage! Mais je me demandais juste pourquoi cela fonctionnait dans le second scénario ... – qwerty

+1

Parce que 'logging.warning()' appelle 'logging.basicConfig()' si la journalisation n'est pas configurée. – phd

2

additionnel à la réponse de phd, appelant logging.basicConfig() est une fonction pratique qui vous permet d'obtenir une valeur par défaut StreamHandler et un Formatter. C'est suffisant si vous voulez avoir rapidement une fonctionnalité de journalisation. Vous pouvez personnaliser son comportement en passant basicConfig quelques arguments:

Ajouter utiles paramters: horodatage de sortie côté du message

logger = logging.basicConfig(level=logging.DEBUG, 
     format='%(asctime)s - %(name)s - %(levelname)s - %message)s') 

Cela devrait être bien pour la plupart de celui de besoins. Si vous avez besoin de plus de contrôle sur votre configuration, vous pouvez ajouter des comportements plus sophistiqués en définissant vous-même les attributs de l'enregistreur.

sophistiqué Exemple: sans utiliser le basicConfig funtion

import logging 
logger = logging.getLogger("mylogger") 
streamHandler = logging.StreamHandler() 
streamHandler.setLevel(logging.DEBUG) 
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %message)s') 
streamHandler.setFormatter(formatter) 

logger.addHandler(streamHandler) 

logger.info("Files copied") 
logger.warning("disk quota exceeded") 
>> 2017-12-06 11:11:12, 090 - mylogger - INFO Files copied 
>> 2017-12-06 11:11:12, 091 - mylogger - WARNING disk quota exceeded 

La prochaine étape dans un plus grand environnement, serait dériver un nouvel enregistreur de la garder précédemment créé un, d'abord la mise en forme et aussi bien pour maintenir un

logger2 = logging.getLogger("mylogger.new") 
logger2.info("New Logger info") 
>> 2017-12-06 11:11:12, 091 - mylogger.new - New logger info 

Une bonne référence est le livre de recettes de l'exploitation forestière: https://docs.python.org/2/howto/logging-cookbook.html