__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.
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
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é.
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.
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