68 votes

Aucun gestionnaire n'a pu être trouvé pour le logger

Je suis novice en matière de python. J'essayais de me loguer dans python et je suis tombé sur Aucun gestionnaire n'a pu être trouvé pour le logger erreur en essayant d'imprimer un avertissement par le biais de l'instance du logger. Voici 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 pu être trouvé pour le logger "logger".

Ce qui m'embrouille, c'est que lorsque j'essaie d'imprimer un avertissement en utilisant logging et ensuite par logger cela fonctionne 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 nous éclairer sur ce qui se passe dans le deuxième scénario ?

1 votes

Pour info, une question similaire avec plus de votes positifs. stackoverflow.com/questions/345991/

79voto

phd Points 20065

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

0 votes

Merci de partager cela ! Mais je me demandais juste pourquoi ça marchait dans le deuxième scénario...

5 votes

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

1 votes

Si vous souhaitez également ajouter des journaux d'information, vous devrez peut-être définir le niveau sur info. logger.setLevel(logging.INFO) .

31voto

praba230890 Points 172

Pour enregistrer un message à travers logger En Python, au moins un gestionnaire doit être ajouté à la fonction logger objet. Par défaut, l'objet debug , warn et d'autres fonctions dans logging appelle le module basicConfig qui, à son tour, ajoutera un StreamHandler au root logger .

C'est toujours recommandé pour ajouter le gestionnaire requis à l'objet logger que vous écrivez pour votre module.

Vous pouvez vous référer à Documents officiels de Python qui a une Superbe tutoriel ou vous pouvez mieux vérifier le code source du module de journalisation vous-même.

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

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

Enfin, l'appel de la basicConfig va explicitement résoudre le problème.

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

17voto

user1767754 Points 460

En complément de la réponse de phd, en appelant logging.basicConfig() est une fonction pratique qui vous permettra d'obtenir une fonction par défaut StreamHandler et un Formatter . C'est suffisant si vous souhaitez disposer rapidement d'une fonctionnalité de journalisation. Vous pouvez personnaliser son comportement en lui passant basicConfig certains 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 suffire pour la plupart des besoins ponctuels. 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 du logger.

Exemple sophistiqué sans utiliser l'option basicConfig fonction

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

L'étape suivante, dans un environnement plus vaste, consisterait à dériver un nouvel enregistreur à partir de l'enregistreur précédemment créé, afin de conserver le formatage et de maintenir une "hiérarchie des enregistrements".

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 cuisine de l'exploitation forestière : https://docs.python.org/2/howto/logging-cookbook.html

0 votes

Il y a une faute de frappe dans la ligne 'formatter' - il manque '('. J'ai mis du temps à comprendre pourquoi j'obtiens une erreur énigmatique en essayant d'exécuter cet exemple.

0voto

Rene Oschmann Points 601

Par souci d'exhaustivité :

Pour que cela fonctionne au niveau d'un module qui pourrait être utilisé ailleurs ou de manière autonome, vous pourriez faire ce qui suit

logger = logging.getLogger(__name__)

# create own logging handler if nobody changed the root logger.
if not logging.root.handlers and not logger.handlers:
    handler = logging.StreamHandler()
    handler.formatter = logging.Formatter('%(asctime)s %(funcName)s %(levelname)s: %(message)s')
    logger.addHandler(handler)

Cela permet d'exécuter le module de manière autonome et d'éviter les conflits s'il est utilisé dans un contexte qui configure déjà le logger Root.

Notez que le message d'erreur décrit dans le billet n'apparaît que dans Python 2. Python 3 imprime le message sur stdout si aucun handler n'est défini dans la hiérarchie.

0voto

Ali Points 504

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

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

RAVEN_CONFIG = {
    'dsn': 'threaded+requests+https://xxxxxxxxxxxx@sentry.example.com/1',
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X