Et ici!
LOGGING_CONFIG = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'standard': {
'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
},
},
'handlers': {
'default': {
'level': 'INFO',
'formatter': 'standard',
'class': 'logging.StreamHandler',
'stream': 'ext://sys.stdout', # Default is stderr
},
},
'loggers': {
'': { # root logger
'handlers': ['default'],
'level': 'WARNING',
'propagate': False
},
'my.packg': {
'handlers': ['default'],
'level': 'INFO',
'propagate': False
},
'__main__': { # if __name__ == '__main__'
'handlers': ['default'],
'level': 'DEBUG',
'propagate': False
},
}
}
Usage:
# Run once at startup:
logging.config.dictConfig(LOGGING_CONFIG)
# Include in each module:
log = logging.getLogger(__name__)
log.debug("Logging is configured.")
Si vous voyez trop de journaux de packages tiers, assurez-vous d'exécuter cette configuration en utilisant logging.config.dictConfig(LOGGING_CONFIG)
avant que les packages tiers ne soient importés.
Référence: https://docs.python.org/3/library/logging.config.html#configuration-dictionary-schema
root
enregistreur: au niveau supérieur du dictionnaire. Il est décrit dans la documentation , a la préférence sur le['loggers']['']
lorsque les deux sont présents, mais à mon avis,['loggers']['']
est plus logique. Voir aussi la discussion ici'disable_existing_loggers': False
as alors vous ne configurez peut-être pas tout le tissu, mais peut-être en réutilisant quelque chose qui est déjà là. Si vous le réglez,True
je ne semble pas obtenir de sortie.format
partir deformatters
?La réponse acceptée est gentille! Mais que se passerait-il si l'on pouvait commencer par quelque chose de moins complexe? Le module de journalisation est une chose très puissante et la documentation est un peu écrasante, surtout pour les novices. Mais pour le début, vous n'avez pas besoin de configurer les formateurs et les gestionnaires. Vous pouvez l'ajouter lorsque vous déterminez ce que vous voulez.
Par exemple:
la source
logging.info('Hello, log')
qui a fait claquer les choses pour moi. La confusion dans la documentation est qu'avec dictConfig, nous n'avons plus besoin d'effectuergetLogger
ou l'une de ces actions.'': { 'level': 'INFO'...
et pourquoi elle ne fonctionne pas sans elle (par exemple, lors de la modification de la valeur vide en une valeur valide telle questandard
getLogger()
si vous voulez plusieurs enregistreurs avec des noms différents. Chacun de ces enregistreurs hérite de la configuration de l'enregistreur racine.getLogger
est toujours facultatif. Lorsque vous utilisez lalogging.info()
méthode directement, l'enregistreur racine est utilisé, tandis qu'avecgetLogger()
vous pouvez avoir différents enregistreurs, avec des noms et des niveaux différents.Exemple avec Stream Handler, File Handler, Rotating File Handler et SMTP Handler
la source
J'ai trouvé la configuration par défaut de Django v1.11.15 ci-dessous, j'espère que cela aide
la source
la source