it-swarm.com.de

Bewährte Python-Methode für die Protokollierung

Bei Verwendung des Moduls logging von Python zu Protokollierungszwecken. Ist es am besten, für jede Klasse einen Logger zu definieren? 

Da einige Dinge überflüssig wären, z. B. der Ort des Dateiprotokolls, dachte ich daran, die Protokollierung in eine eigene Klasse zu abstrahieren und eine Instanz in jede meiner Klassen zu importieren, die eine Protokollierung erfordern. Ich bin mir jedoch nicht sicher, ob dies die beste Methode ist oder nicht.

24
Lucas Kauffman

JSON- oder YAML-Protokollierungskonfiguration verwenden - Nach Python 2.7 können Sie die Protokollierungskonfiguration von einem Diktier aus laden. Dies bedeutet, dass Sie die Protokollierungskonfiguration aus einer JSON- oder YAML-Datei laden können.

Yaml Beispiel

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 - Gute Protokollierungspraxis

19
onsy

Es empfiehlt sich, die Python-Regeln für die (De-) Komposition von Software zu befolgen. Das Modul ist die Einheit der Python-Software und nicht die Klasse. Daher ist der empfohlene Ansatz zu verwenden

logger = logging.getLogger(__name__)

in jedem Modul und zum Konfigurieren der Protokollierung (mit basicConfig() oder dictConfig()) aus dem Hauptskript.

Logger sind Singletons - es hat keinen Sinn, sie weiterzugeben oder in Instanzen Ihrer Klassen zu speichern.

22
Vinay Sajip

Verwenden Sie strukturierte Protokollierung. Zwei großartige Werkzeuge dafür:

  • Eliot : Logging sagt dir warum es passiert ist

Die meisten Protokollierungssysteme sagen Ihnen, was in Ihrer Anwendung passiert ist. eliot sagt dir auch, warum es passiert ist.

eliot ist ein Python-Protokollierungssystem, das kausale Ketten von .__ ausgibt. Aktionen: Aktionen können andere Aktionen hervorbringen und letztendlich entweder Erfolg oder Misserfolg Die sich ergebenden Protokolle erzählen Ihnen die Geschichte Ihrer Software tat: Was ist passiert und was hat es verursacht.

  • Structlog : structlog macht das Protokollieren in Python weniger schmerzhaft und leistungsfähiger, indem es die Protokolleinträge strukturiert.

Strukturierte Protokollierung bedeutet, dass Sie nicht schwer zu analysieren und schwer zu halten konsistente Prosa in Ihren Protokollen, aber Sie protokollieren Ereignisse das passiert stattdessen in einem Kontext.

0
Hatshepsut