web-dev-qa-db-fra.com

Aucun gestionnaire n'a pu être trouvé pour l'enregistreur

Je suis novice en python. J'essayais de me connecter à python et je suis tombé sur aucun gestionnaire n'a été trouvé pour le consignateur erreur lors d'une tentative d'impression d'un avertissement via l'instance de consignateur. Ci-dessous le code que j'ai essayé

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

Et j'obtiens cette erreur Aucun gestionnaire n'a été trouvé pour le logger "logger"

Ce qui me dérange, c’est quand j’essaie d’imprimer un avertissement avec logging puis avec logger, cela fonctionne bien, comme par exemple

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

Quelqu'un peut-il nous éclairer sur ce qui se passe dans le deuxième scénario?

56
qwerty

Pour enregistrer un message via logger, dans Python, au moins un gestionnaire doit être ajouté à l'objet logger. Par défaut, debug, warn et les autres fonctions du module logging appellent basicConfig, ce qui ajoute un StreamHandler au root logger.

Il est toujours recommandé d'ajouter votre gestionnaire requis à l'objet enregistreur que vous écrivez pour votre module.

Vous pouvez vous référer à officiel Python docs , qui a un tutoriel génial ou vous pouvez mieux consulter le code source du module de journalisation vous-même.

Vous pouvez simplement vérifier le source dans Python Shell lui-même par,

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

Enfin, appeler explicitement le basicConfig résoudra le problème.

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

Appelez logging.basicConfig ():

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

En plus de la réponse de phd, appeler logging.basicConfig() est une fonction pratique qui vous donnera un StreamHandler par défaut et un Formatter. Cela suffit si vous souhaitez disposer rapidement d’une fonctionnalité de journalisation. Vous pouvez personnaliser son comportement en passant basicConfig quelques arguments:

Ajouter des paramètres utiles : horodatage de sortie à côté du message

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

Cela devrait convenir à la plupart des besoins uniques. 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.

Exemple sophistiqué : sans utiliser la fonction basicConfig

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 environnement plus vaste serait de dériver un nouvel enregistreur à partir de celui précédemment créé, de conserver d'abord le formatage et de conserver une "hiérarchie des journaux".

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 journalisation: https://docs.python.org/2/howto/logging-cookbook.html

12
user1767754

Si vous obtenez cette erreur en utilisant sentry (No handlers could be found for logger "sentry.errors"), cela peut être dû à un bogue sentry pour le support SNI.

vérifiez https://github.com/getsentry/raven-python/issues/52 pour plus de détails. une solution rapide consiste à remplacer le schéma DSN par threaded+requests+https:

RAVEN_CONFIG = {
    'dsn': 'threaded+requests+https://[email protected]/1',
}
0
Ali