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?
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')
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
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
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',
}