2013-06-01 3 views
11

Standardmäßig kann ich die Anmeldung in settings.py in der Konfiguration EINSTELLUNGEN aktivieren, indem ich einen Logger "" erstelle, der alle abfängt. Aber was, wenn ich nur die Abholzung von den Apps meines Projektes im Gegensatz zu Django Einbauten sehen möchte?Django Logging nur für meine Apps

Ich kann mir vorstellen, explizit einen Logger in jedem meiner Django-App-Module zu bekommen und ihn nach einer Konvention zu benennen, z. logging.getLogger("myproject." + __file__). Dann kann ich einen Logger namens 'myproject' (in SETTINGS) erstellen, der alle diese zur Ausgabe aufnimmt. Ich würde es vorziehen, meinen Projektnamen nicht hart zu codieren, also würde ich eine os.path-Logik auf ___file___ ausführen, um den vollständigen Namespace bis zu der Datei in beliebiger Tiefe zu extrahieren.

An diesem Punkt höre ich auf und frage mich, gibt es einen einfacheren Weg?

+1

Haben Sie die Logging-Dokumente (https://docs.djangoproject.com/en/dev/topics/logging/#configuring-logging) gelesen? Es gibt einen "myproject.custom" -Logger, der ähnlich aussieht wie Sie suchen. –

+0

Ja, tat ich. Ich habe nichts gesehen, was das, was ich beschrieben habe, vereinfachen würde, aber wenn es das wäre, wäre das eine gute Antwort. –

+1

Ich habe deine Frage erneut gelesen, nachdem ich meinen Kommentar gepostet habe, und habe festgestellt, dass sie wahrscheinlich keinen zusätzlichen Einblick bieten würde. Um das, Entschuldigung. –

Antwort

9

Nicht sicher, ob ich Ihre Frage vollständig verstanden habe, weil die Antwort zu einfach scheint.

Angenommen, Sie haben in LOGGING ein Handler für Ihr Projekt Anwendungen definiert, zum Beispiel wie folgt aus:

'handlers': { 
    'handler_for_my_apps': { 
     'level': 'DEBUG', 
     'class': 'logging.FileHandler', 
     'filename': 'debug.log', 
    }, 

und Ihre Anwendungen app1 gegeben, app2, und so können Sie alle Protokolle aus diesen Anwendungen haben, ohne jedes Django interne Protokolle durch die Logger definieren:

'loggers': { 
    'app1': { 
     'handlers': ['handler_for_my_apps'], 
     'level': 'DEBUG', 
    }, 
    'app2': { 
     'handlers': ['handler_for_my_apps'], 
     'level': 'DEBUG', 
    }, 

Es wird keine Django-Protokolle in der gleichen Datei, es sei denn natürlich einen Logger django mit einem han Namen definiert dler handler_for_my_apps.

In Ihren Apps können Sie den Logger mit logging.getLogger(__name__), wie von den Dokumenten empfohlen. ohne mit identischen Logger für alle lokalen Anwendungen zu erstellen, um sie manuell hinzufügen alle in die Logging-Konfiguration

Wenn ich Ihre Frage ...

mißverstanden
6

Sie ein System wie das folgende verwenden könnte.

Zuerst aufzuschlüsseln Ihre lokale Anwendungen:

LOCAL_APPS = [ 
    'myapp1', 
    'myapp2', 
    ... 
] 

THIRD_PARTY_APPS = [ 
    'django. ...', 
    ... 
] 

INSTALLED_APPS = LOCAL_APPS + THIRD_PARTY_APPS 

Next Logger Konfiguration für lokale Anwendungen erstellen:

local_logger_conf = { 
    'handlers': ['my_handler',], 
    'level': 'DEBUG', 
} 

Schließlich Ihre Logger wie folgt definieren:

'loggers': { app: copy.deepcopy(local_logger_conf) for app in LOCAL_APPS }