[Python] Une compréhension approximative du module de journalisation

Personnage

image.png

__Logger class __: Il s'agit du corps principal de la journalisation. Gérez de la génération du journal à l'envoi à l'emplacement souhaité. Le gestionnaire et le filtre peuvent être définis pour chaque objet généré à partir de la classe Logger. Logger a une structure hiérarchique (décrite plus loin) et hérite des paramètres parents par héritage.

__root (objet rootLogger) __: Un objet de la classe Logger par défaut et le parent de tous les enregistreurs. Doit en être un. Tous les journaux écrits dans logging.info () etc. coulent ici.

__Original Logger object __: Un objet de la classe Logger d'origine créée par getLogger (" logger name "). En créant chaque fichier, vous pouvez voir explicitement de quel fichier le journal est, et vous pouvez définir le niveau de journal et le gestionnaire pour chacun. Il est possible de créer une structure hiérarchique (décrite plus loin).

LogRecord: corps du journal. Généré par Logger.

Handler: Gérez où LogRecord est livré (sortie standard, écriture de fichier, requête HTTP, etc.). Spécifiez dans Logger. → Divers gestionnaires: https://docs.python.org/ja/3/howto/logging.html#useful-handlers

Formatter: spécifiez le format du journal. Spécifiez dans Handler.

Filter: Gérez les journaux qui sont générés. Spécifiez dans Logger ou Handler.

Hiérarchie des enregistreurs

image.png

Flux de journalisation

Vérifiez le flux de journalisation en utilisant mod2 et mod2.fuga dans la structure hiérarchique ci-dessus. https://docs.python.org/ja/3/howto/logging.html#logging-flow

loggingtest.py


import logging
import loggingtest2

logger = logging.getLogger("mod2")
logger.setLevel(logging.DEBUG)

#Génération de format
formatter = logging.Formatter('parent: %(name)s [%(levelname)s] %(message)s')

#Génération du gestionnaire de la sortie d'erreur standard
handler = logging.StreamHandler()

#Différents paramètres du gestionnaire
handler.setLevel(logging.ERROR)
handler.setFormatter(formatter)

#Attachez un manipulateur à l'enregistreur
logger.addHandler(handler)

if __name__ == "__main__":
    loggingtest2.test()

loggingtest2.py


import logging

def test():
    logger = logging.getLogger("mod2.fuga")
    logger.setLevel(logging.DEBUG)

    #Génération de format
    formatter = logging.Formatter('child: %(name)s [%(levelname)s] %(message)s')

    #Génération / paramétrage du gestionnaire
    handler = logging.StreamHandler()
    handler.setLevel(logging.WARNING)
    handler.setFormatter(formatter)

    logger.addHandler(handler)
    #logger.propagate = False  #Voir ci-dessous

    logger.error("bbb")

Lorsqu'il est exécuté dans cet état, il est généré à la fois par le gestionnaire parent et le gestionnaire enfant.

$ python loggingtest.py
child: mod2.fuga [ERROR] bbb
parent: mod2.fuga [ERROR] bbb

image.png

Comme vous pouvez le voir en essayant d'autres choses, si vous définissez la condition du gestionnaire de loggingtest2.py sur "CRITICAL" ou supérieur, child: ~~ ne sera pas affiché, et si vous supprimez le point de getLogger () et aplatissez la structure hiérarchique Seul child: ~~ est affiché car le gestionnaire du parent mod2 n'est plus appelé.

attribut de propagation

La traduction littérale de propagate est «propagate» et cet attribut spécifie s'il faut propager le LogRecord à son parent. Vous pouvez confirmer que le parent n'est pas appelé en décommentant logger.propagate = False dans le code ci-dessus.

Hors des paramètres de journalisation

Les paramètres de journalisation peuvent être décrits dans un fichier séparé appelé logging.conf et lu avec fileConfig (). Par conséquent, la partie des paramètres de journalisation peut être séparée du corps de traitement. Voir la documentation officielle pour plus de détails.

Recommended Posts

[Python] Une compréhension approximative du module de journalisation
[Python] Une compréhension approximative des itérables, des itérateurs et des générateurs
[Python] Comprendre le potentiel_field_planning de Python Robotics
Une compréhension approximative de python-fire et un mémo
Passez le chemin du module python importé
Créer un diagramme de relations des modules Python
[python] [meta] Le type de python est-il un type?
L'histoire du traitement A du blackjack (python)
Mémorandum de l'outil de gestion de paquets Python ez_setup
L'histoire de la création d'un module qui ignore le courrier avec python
Créez un programme de jugement de compatibilité avec le module aléatoire de python.
Si vous voulez un singleton en python, considérez le module comme un singleton
Créer un module Python
Récupérer l'appelant d'une fonction en Python
le zen de Python
Écrire une note sur la version python de python virtualenv
Sortie sous la forme d'un tableau python
Essayez d'utiliser le module de collections (ChainMap) de python3
Prise en compte des forces et faiblesses de Python
[Python] Un programme qui compte le nombre de vallées
Découpez une partie de la chaîne à l'aide d'une tranche Python
[python] Récupère la liste des classes définies dans le module
Implémentation python de la classe de régression linéaire bayésienne
Points Python du point de vue d'un programmeur en langage C
Utilisons la version Python du module API Confluence.
Tâches au démarrage d'un nouveau projet python
Un mémorandum sur la mise en œuvre des recommandations en Python
[Python] Un programme qui compare les positions des kangourous.
Note Python: Le mystère de l'attribution d'une variable à une variable
Vers la retraite de Python2
Python - Démarrage rapide de la journalisation
À propos du module Python venv
Mise à jour automatique du module Python
À propos des fonctionnalités de Python
Compréhension complète du débogage Python
Le pouvoir des pandas: Python
Une note de malentendu lors de la tentative de chargement de l'intégralité du module self-made avec Python3
Une implémentation Python simple de la méthode k-voisinage (k-NN)
Facilitez la compréhension de l'affichage des exceptions du module Python
Connaissances minimales pour démarrer avec le module de journalisation Python
Afficher à l'aide du module python du backend mobile Nifty Cloud
Différent du type d'importation de python. Signification de depuis A import B
Obtenez le nombre d'éléments spécifiques dans la liste python
[Note] Importation de fichiers dans le répertoire parent en Python
Quelle est la version TLS par défaut du module de requêtes python?
Trouver les valeurs propres d'une vraie matrice symétrique en Python
2015-11-26 python> Afficher la liste des fonctions du module> import math> dir (math)
Script Python qui compare le contenu de deux répertoires
Tester la version du module argparse
L'histoire de Python et l'histoire de NaN
Une bonne description des décorateurs Python
[Python] journalisation dans votre propre module
First Python 3 ~ Le début de la répétition ~
[Python] Un mémorandum de belle soupe4
Un bref résumé de la collection Python
Existence du point de vue de Python
pyenv-changer la version python de virtualenv
Un résumé approximatif de l'histoire du système d'exploitation