web-dev-qa-db-fra.com

Python meilleure pratique en termes de journalisation

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?

24
Lucas Kauffman

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]

Ref - Good-logging-practice-in-python

19
onsy

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.

22
Vinay Sajip

Utilisez la journalisation structurée. Deux excellents outils pour cela:

  • Eliot : Une journalisation qui explique pourquoi c'est arrivé

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

  • Structlog : structlog rend la journalisation dans Python moins pénible et plus puissante en ajoutant une structure à vos entrées de journal.

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.

0
Hatshepsut