Introduction détaillée à la journalisation en Python (avec exemples)

不言
Libérer: 2019-01-17 11:20:27
avant
2675 Les gens l'ont consulté

Cet article vous apporte une introduction détaillée à la connexion en Python (avec des exemples). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.

Introduction

Il existe de nombreuses utilisations de base de la journalisation sur Internet, je ne les présenterai donc pas ici. Avant d'introduire le texte principal, examinons d'abord une exigence :

Supposons que vous ayez besoin d'encapsuler une certaine fonction dans une bibliothèque de classes pour que d'autres puissent l'utiliser, comment gérer les journaux dans la bibliothèque de classes ?

Il y a quelques années dans un Dans les projets développés en C#, j'ai utilisé cette méthode : définir une classe de base de journalisation. Toutes les classes qui doivent utiliser la journalisation héritent de cette classe de base. Événement LogHandler, qui est utilisé pour implémenter des actions de journalisation spécifiques. En même temps, le délégué LogHandler de la classe A peut être lié au délégué de la classe B. Sur LogHandler, les informations de journal des deux classes sont additionnées.

Depuis que j'ai examiné l'implémentation de la journalisation en python, j'ai trouvé que mon approche était vraiment faible.

J'ai présenté la sortie du journal dans le framework peewee dans mon précédent blog Python : L'utilisation de logging.NullHandler Pour faire simple, un Logger nommé peewee est défini dans peewee et un NullHandler est ajouté L'appelant You. il suffit d'ajouter un gestionnaire spécifique pour afficher le journal, ce qui est très pratique.


Supposons que nous ayons également un Logger dans le programme principal. Après avoir appelé peewee, je souhaite afficher les deux journaux dans le même fichier journal. Évidemment, il n'est pas conseillé de faire pointer le FileHandler de deux journaux vers le même fichier journal, car il existe un risque de préemption simultanée des fichiers. Bien sûr, nous pouvons également nommer le Logger dans le programme principal comme peewee, mais ce n'est pas seulement trop faible, mais aussi si une autre bibliothèque est appelée, qui encapsule également un Logger, ce sera difficile à gérer.

Enregistreur de structure de souche d'arbre

L'objet Logger est conçu comme une structure arborescente et il a un attribut parent. Un enregistreur nommé root est défini dans la journalisation comme le nœud racine de tous les enregistreurs, et l'attribut parent de root est Aucun. la racine est globale.

Lors de l'appel de

logging.getLogger(name=None)
Copier après la connexion

pour obtenir un objet Logger, si le nom est None, la racine du nœud racine est renvoyée. Si name contient ., tel que name = 'a.b', alors s'il existe déjà un Logger nommé a, alors a.b est le nœud enfant de a. S'il n'y a pas de Logger nommé a, alors a.b est le nœud enfant de root. .noeud.

Une fois que l'enregistreur enfant a terminé de traiter le message de journal, il transmettra par défaut le message de journal à son enregistreur parent. Par conséquent, nous n'avons pas besoin de définir et de configurer des gestionnaires pour tous les enregistreurs utilisés dans une application. Il suffit de configurer les gestionnaires pour un enregistreur de niveau supérieur, puis de créer des enregistreurs enfants si nécessaire. Nous pouvons désactiver ce mécanisme de livraison en définissant la propriété de propagation du Logger sur False.

Qu'est-ce que cela signifie ? Regardons le code :

import logging
logA = logging.getLogger('a')
logA.setLevel(logging.DEBUG)
logA.addHandler(logging.StreamHandler())
logB = logging.getLogger('a.b')
logB.addHandler(logging.StreamHandler())
Copier après la connexion

Résultat de sortie :

Logger A
Logger B
Logger B
Copier après la connexion

La raison pour laquelle Logger B est généré deux fois est que logB est Le nœud enfant de logA et le gestionnaire sont également définis dans logB, donc le gestionnaire de logB est généré une fois et le gestionnaire de logA est également généré une fois, soit deux fois. Si vous souhaitez afficher une seule fois, vous pouvez supprimer le gestionnaire dans logB. Bien sûr, cela peut être utile, surtout si vous ne disposez pas d’un outil de gestion des logs. Par exemple, vous devez générer tous les journaux du programme principal pour comprendre la séquence d'exécution globale du programme, mais vous souhaitez générer un journal séparé d'un certain module afin de pouvoir comprendre clairement le rapport d'erreurs ou la séquence d'exécution dans le module. .

L'exemple peewee précédent est facile à résoudre. Il vous suffit de définir l'attribut parent du journal peewee sur le journal du programme principal.

Conclusion

En fait, c'est un problème relativement facile à expliquer, et il n'est pas nécessaire d'écrire autant. Je ne veux pas partager avec vous comment utiliser la journalisation en python, mais je veux partager avec vous une idée de la façon dont la journalisation est implémentée, car j'ai rencontré ce problème et conçu une solution, puis j'ai été complètement époustouflé. loin.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:cnblogs.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal