Python: module de journalisation dans le monde entier
Je me demandais comment mettre en œuvre un mondial enregistreur de frappe qui pourrait être utilisé partout avec vos propres paramètres:
J'ai actuellement une coutume enregistreur de classe:
class customLogger(logging.Logger):
...
La classe est dans un fichier séparé avec certains formateurs et d'autres choses.
L'enregistreur fonctionne parfaitement sur son propre.
- Je importer ce module dans mon principal fichier python et créer un objet comme ceci:
self.log = logModule.customLogger(arguments)
Mais évidemment, je ne peux pas accéder à cet objet à partir d'autres parties de mon code.
Suis-je à l'aide d'une approche erronée? Est-il une meilleure façon de le faire?
- Je ne suis pas sûr de comprendre ce qu'est la "journalisation" limitation que vous essayez de surmonter
Vous devez vous connecter pour publier un commentaire.
Utilisation
journalisation.getLogger(nom)
pour créer un nom de global enregistreur.main.py
log.py
submodule.py
Sortie
submodule.py
, puis la définition globale n'est pas telle. On pourrait de même viens de ré-initialisé, l'enregistreur de données dans chaque sous-module de lecture à partir d'un fichier de config (en fait, exigeant, même de moins en moins de coups de clés).Puisque je n'ai pas trouvé une réponse satisfaisante, je voudrais des précisions sur la réponse à la question un peu afin de donner un aperçu sur le fonctionnement et les intentions de la
logging
de la bibliothèque, qui est livré avec Python standard library.Contrairement à l'approche de l'OP (affiche originale), la bibliothèque sépare clairement l'interface de l'enregistreur de données et de la configuration de l'enregistreur lui-même.
Cela signifie que vous devez pas créer un enregistreur de classe et de configurer l'enregistreur de données à l'intérieur de cette classe par l'ajout de la configuration ou que ce soit.
La
logging
bibliothèque présente quatre composantes: enregistreurs de, gestionnaires, filtres, et formateurs.Un projet commun de la structure ressemble à ceci:
À l'intérieur de votre code (comme dans module.py) vous référer à l'enregistreur à l'exemple de votre module pour enregistrer les événements à leurs niveaux.
La variable spéciale
__name__
se réfère à votre module nom et ressemble à quelque chose commeproject.package.module
selon le code de votre application structure.module.py (et de toute autre catégorie) pourrait essentiellement ressembler à ceci:
L'enregistreur de données dans chaque module se propager tout cas, le parent enregistreur qui, en retour, transmet les informations à son attaché gestionnaire! Ce fut le cas pour le paquet python/la structure du module, le parent enregistreur est déterminé par l'espace de noms à l'aide de "en pointillé les noms de module". C'est pourquoi il est préférable d'initialiser l'enregistreur avec la
__name__
variable (dans l'exemple ci-dessus nom correspond à la chaîne "du projet.package.module").Il y a deux options pour configurer l'enregistreur de données à l'échelle mondiale:
Instancier un enregistreur project.py avec le nom
__package__
ce qui équivaut à "projet" dans cet exemple, et est donc le parent enregistreur de les bûcherons de tous les submodules. Il est seulement nécessaire d'ajouter un gestionnaire et formateur à ce enregistreur.Configurer un enregistreur, un gestionnaire et formateur dans l'exécution de script (comme main.py) avec le nom du premier paquet.
L'exécution du script, comme main.py par exemple, pourrait enfin ressembler à quelque chose comme ceci:
L'appel de la méthode
log.setLevel(...)
spécifie le bas de la gravité du message de journal d'un logger poignée mais pas nécessairement de sortie! Cela signifie tout simplement que le message est passé au gestionnaire de tant que le message est le niveau de gravité est supérieur (ou égal) à celui qui est défini. Mais le gestionnaire est responsable de manipulation le message de log (par impression ou de stockage par exemple).D'où le
logging
bibliothèque propose un cadre structuré et approche modulaire qui doit juste être exploitées selon les besoins.La journalisation de la documentation
Créer une instance de
customLogger
dans votre journal du module et de l'utiliser comme un singleton - il suffit d'utiliser l'instance importée, plutôt qu'à la classe.Vous pouvez simplement passer une chaîne de caractères avec une commune de la sous-chaîne à l'avant de la première période. Les parties de la chaîne de caractères séparées par le point (".") peut être utilisé pour les différentes classes /modules /fichiers /etc. Comme (en particulier le
logger = logging.getLogger(loggerName)
partie):