2016-07-20 4 views
0

Ich habe eine Anwendung, die aus vielen verschiedenen Modulen besteht, aber alles ist immer noch Teil einer einzigen Anwendung. Wie kann ich einen Logger richtig teilen, so dass alles in dieselbe Datei schreibt. Muss ich einen Logger übergeben? Ich würde es vorziehen, dies nicht tun zu müssen.Wie kann ich einen Logger für eine große Anwendung freigeben?

Beispielprojekt Layout:

/ 
    __init__.py 
    main_application.py 
    functions_group1.py 
    functions_group2.py 
    functions_group3.py 

Ich möchte so eine logger in main_application.py wie definieren können:

logger = logging.getLogger() 
logger.setLevel(logging.DEBUG) 
file_log = logging.FileHandler('logs/%s.log' % (file_name), 'a', encoding='UTF-8') 
file_log.setLevel(file_level) 
formatter = logging.Formatter('%(asctime)s - %(levelname)-8s - %(name)-12s - %(message)s') 
file_log.setFormatter(formatter) 
logger.addHandler(file_log) 

dann in der Lage sein functions_group3 verwenden logger in functions_group1, functions_group1, das sind wie folgt in main_application importiert:

Jede dieser Dateien

hat nur eine Liste von Funktionen (gruppiert nach ähnlicher Funktionalität)

functions_group1

def function1_dothing(): 
    # Want to log in here! 
    return ... 

def function1_dothing2(): 
    # Want to log in here! 
    return ... 

def function1_dothing3(): 
    # Want to log in here! 
    return ... 

Wie kann ich die logger über die gesamte Anwendung teilen?

+1

Haben Sie darüber nachgedacht, https://docs.python.org/3/howto/logging.html zu lesen? – jonrsharpe

+0

Welchen Teil empfehlen Sie @jonrsharpe? Ich weiß, wie man einen Logger erstellt. Ich weiß nicht, wie ich es über die gesamte Anwendung verteilen kann, ohne das Logger-Objekt überall hin zu geben. – Loggy

+0

Sie müssen * nicht "einen einzigen Logger teilen" *; Jeder Teil erstellt einen Logger für seinen '__name__', aber Sie können konfigurieren, was mit diesen Protokollen geschieht (z. B. Schreiben in eine Datei) auf der obersten Ebene Ihres Moduls. – jonrsharpe

Antwort

2

Ich denke, der Punkt, den Sie vermissen, ist, dass Python-Logger standardmäßig hierarchisch sind. In Ihrer Hauptanwendung erstellen Sie einfach einen Logger mit einem festen Namen (Sie können den Namen des Hauptskriptes verwenden). Zum Beispiel:

mainapp.py: 

import logging 

root_logger = logging.getLogger(appname()) 
# do any logger setup 

wo appname() ist wie folgt definiert:

def appname(): 
    return os.path.splitext(os.path.basename(sys.argv[0]))[0] 

In jedem Ihrer Module können Sie entweder die Root-Logger bekommen oder ein Kind des Wurzel Logger bekommen.

moduleX.py: 

import logging 
module_logger = logging.getLogger("%s.moduleX" % (appname())) 

Jede Protokollierung dass module_logger führt durch den Root-Logger behandelt werden. Mit dem Modul logging können Sie noch viel mehr erreichen. Vielleicht wird ein weiterer Beitrag von https://docs.python.org/2/howto/logging.html mit einer anderen Perspektive wertvoll sein.

Verwandte Themen