2014-04-02 17 views
18

Bei Verwendung des Moduls logging von Python für Protokollierungszwecke. Ist es am besten, einen Logger für jede Klasse zu definieren?Python Best Practices in Bezug auf Protokollierung

In Anbetracht der Tatsache, dass einige Dinge überflüssig wären, wie z. B. Speicherort der Dateiprotokollierung, dachte ich daran, die Protokollierung auf ihre eigene Klasse zu abstrahieren und eine Instanz in jede Klasse zu importieren. Aber ich bin mir nicht sicher, ob das Best Practice ist oder nicht?

Antwort

14

Verwenden Sie die JSON- oder YAML-Protokollierungskonfiguration - Nach Python 2.7 können Sie die Protokollierungskonfiguration von einem Diktat 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 - Good-logging-practice-in-python

18

Best Practice ist Python Regeln für Software (de) Komposition zu folgen - das Modul ist die Einheit der Python-Software, nicht die Klasse. Daher ist der empfohlene Ansatz

logger = logging.getLogger(__name__) 

in jedem Modul zu verwenden, und die Anmeldung zu konfigurieren aus dem Haupt-Skript (basicConfig() oder dictConfig() verwenden).

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

+0

Ist 'Logger = logging.getLogger (__ Name __)' an der Oberseite des Moduls gehen oder in jeder Funktion/Methode, die protokollieren will ? – industryworker3595112

+3

@ industryworker3595112 am Anfang des Moduls (nach den 'import' Anweisungen) –