Lorsque vous utilisez le module logging
de python à des fins de journalisation. Est-il préférable de définir un enregistreur pour chaque classe?
Considérant que certaines choses seraient redondantes, telles que l'emplacement du journal des fichiers, je pensais résumer la journalisation dans sa propre classe et importer une instance dans chacune de mes classes nécessitant une journalisation. Cependant, je ne suis pas sûr que ce soit la meilleure pratique ou non?
Utiliser la configuration de journalisation JSON ou YAML - Après Python 2.7, vous pouvez charger la configuration de journalisation à partir d'un dict. Cela signifie que vous pouvez charger la configuration de journalisation à partir d'un fichier JSON ou YAML.
Exemple Yaml -
version: 1
disable_existing_loggers: False
formatters:
simple:
format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
handlers:
console:
class: logging.StreamHandler
level: DEBUG
formatter: simple
stream: ext://sys.stdout
info_file_handler:
class: logging.handlers.RotatingFileHandler
level: INFO
formatter: simple
filename: info.log
maxBytes: 10485760 # 10MB
backupCount: 20
encoding: utf8
error_file_handler:
class: logging.handlers.RotatingFileHandler
level: ERROR
formatter: simple
filename: errors.log
maxBytes: 10485760 # 10MB
backupCount: 20
encoding: utf8
loggers:
my_module:
level: ERROR
handlers: [console]
propagate: no
root:
level: INFO
handlers: [console, info_file_handler, error_file_handler]
La meilleure pratique consiste à suivre les règles de Python en matière de (dés) composition du logiciel - le module est l'unité du logiciel Python, pas la classe. Par conséquent, l’approche recommandée consiste à utiliser
logger = logging.getLogger(__name__)
dans chaque module, et pour configurer la journalisation (en utilisant basicConfig()
ou dictConfig()
) à partir du script principal.
Les enregistreurs sont des singletons - il est inutile de les faire circuler ou de les stocker dans des instances de vos classes.
Utilisez la journalisation structurée. Deux excellents outils pour cela:
La plupart des systèmes de journalisation vous disent ce qui s'est passé dans votre application, alors qu'eliot vous dit aussi pourquoi c'est arrivé.
eliot est un système de journalisation Python qui génère des chaînes causales de actions: les actions peuvent engendrer d'autres actions, et éventuellement elles réussir ou échouer. Les journaux qui en résultent vous racontent l’histoire de ce que votre le logiciel a fait: ce qui est arrivé et ce qui l’a causé.
La journalisation structurée signifie que vous n’écrivez pas les fichiers difficiles à analyser et difficile à conserver cohérente dans vos journaux mais que vous enregistrez les événements cela se produit plutôt dans un contexte.