web-dev-qa-db-fra.com

Python la journalisation ne génère rien

Dans un script python que j'écris, j'essaie de consigner les événements à l'aide du module de consignation. J'ai le code suivant pour configurer mon consignateur:

ERROR_FORMAT = "%(levelname)s at %(asctime)s in %(funcName)s in %(filename) at line %(lineno)d: %(message)s"
DEBUG_FORMAT = "%(lineno)d in %(filename)s at %(asctime)s: %(message)s"
LOG_CONFIG = {'version':1,
              'formatters':{'error':{'format':ERROR_FORMAT},
                            'debug':{'format':DEBUG_FORMAT}},
              'handlers':{'console':{'class':'logging.StreamHandler',
                                     'formatter':'debug',
                                     'level':logging.DEBUG},
                          'file':{'class':'logging.FileHandler',
                                  'filename':'/usr/local/logs/DatabaseUpdate.log',
                                  'formatter':'error',
                                  'level':logging.ERROR}},
              'root':{'handlers':('console', 'file')}}
logging.config.dictConfig(LOG_CONFIG)

Lorsque j'essaie d'exécuter logging.debug("Some string"), je n'obtiens aucune sortie vers la console, même si cette page dans la documentation dit que logging.debug Devrait avoir l'enregistreur racine en sortie le message. Pourquoi mon programme ne produit-il rien et comment puis-je le corriger?

58
murgatroid99

Le niveau de journalisation par défaut est l'avertissement. Puisque vous n'avez pas modifié le niveau, le niveau de l'enregistreur racine est toujours en alerte. Cela signifie qu'il ignorera tout enregistrement avec un niveau inférieur à l'avertissement, y compris les enregistrements de débogage.

Ceci est expliqué dans le tutoriel :

import logging
logging.warning('Watch out!') # will print a message to the console
logging.info('I told you so') # will not print anything

La ligne "info" n'imprime rien, car le niveau est supérieur à info.

Pour changer le niveau, il suffit de le définir dans le root logger:

'root':{'handlers':('console', 'file'), 'level':'DEBUG'}

En d'autres termes, il ne suffit pas de définir un gestionnaire avec level = DEBUG, le niveau de journalisation réel doit également être DEBUG pour qu'il puisse tout afficher.

77
Omri Barel

Peut-être essayer ça? Il semble que le problème soit résolu après avoir supprimé tous les gestionnaires de mon cas.

for handler in logging.root.handlers[:]:
    logging.root.removeHandler(handler)

logging.basicConfig(filename='output.log', level=logging.INFO)
6
yue dong

De nombreuses années plus tard, il semble toujours y avoir un problème d'utilisation avec l'enregistreur Python. Voici quelques explications avec des exemples:

import logging
# This sets the root logger to write to stdout (your console)
logging.basicConfig()

# By default the root logger is set to WARNING and all loggers you define
# inherit that value. Here we set the root logger to NOTSET. This logging
# level is automatically inherited by all existing and new sub-loggers
# that do not set a less verbose level.
logging.root.setLevel(logging.NOTSET)

# The following line sets the root logger level as well:
logging.basicConfig(level=logging.NOTSET)


# You can either share the `logger` object between all your files or the
# handle `my-app`. The result is the same.
logger = logging.getLogger("my-app")

logger.info("this will get printed")

# In large applications where you would like more control over the logging,
# create sub-loggers from your main application logger.
component_logger = logger.getChild("component-a")
component_logger.info("this will get printed with the prefix `my-app.component-a`")

# If you wish to control the logging levels, you can set the level anywhere in the
# hierarchy:
#
# - root
#   - my-app
#     - component-a
#

# Example for development:
logger.setLevel(logging.DEBUG)

# If that prints too much, enable debug printing only for your component:
component_logger.setLevel(logging.DEBUG)


# For production you rather want:
logger.setLeve(logging.WARNING)

Une source courante de confusion provient d'un enregistreur racine mal initialisé. Considère ceci:

import logging
log = logging.getLogger("myapp")
log.warning("woot")
logging.basicConfig()
log.warning("woot")

Sortie:

woot
WARNING:myapp:woot

En fonction de votre environnement d'exécution et de vos niveaux de journalisation, la première ligne de journal peut ne s'afficher nulle part.

5

Pour tous ceux qui veulent une réponse super simple: définissez simplement le niveau que vous souhaitez afficher. En haut de tous mes scripts, je viens de mettre:

import logging
logging.basicConfig(level = logging.INFO)

Ensuite, pour afficher quoi que ce soit à ou au-dessus de ce niveau:

logging.info("Hi you just set your fleeb to level plumbus")

Il s'agit d'un ensemble hiérarchique de niveaux afin que les journaux s'affichent au niveau que vous avez défini ou supérieur . Donc, si vous voulez afficher une erreur, vous pouvez utiliser logging.error("The plumbus is broken").

Les niveaux sont DEBUG, INFO, WARNING et ERROR. Le paramètre par défaut est WARNING.

Ceci est un bon article contenant ces informations mieux exprimées que ma réponse:
https://www.digitalocean.com/community/tutorials/how-to-use-logging-in-python-

0
neuronet