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.
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]
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.
Verwenden Sie strukturierte Protokollierung. Zwei großartige Werkzeuge dafür:
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.
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.