2012-06-21 16 views
5

Ich versuche, eine Variable zu meiner Protokollzeile über meine settings.py-Datei hinzuzufügen. Django: Variable an Protokolldatei in Einstellungsdatei übergeben

Dies ist der Code in den Einstellungen (das Logging Teil):

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'handlers': { 
     'mail_admins': { 
         'level': 'CRITICAL', 
         'class': 'django.utils.log.AdminEmailHandler' 
         }, 

     'customhandler':{ 
         'level':'DEBUG', 
         'class':'logging.RotatingFileHandler', 
         'formatter':'custom_format', 
         'filename':LOG_LOCATION 
         }, 
       }, 

    'loggers': { 
     'django.request': { 
         'handlers': ['mail_admins'], 
         'level': 'CRITICAL', 
         'propagate': True, 
          }, 
     'Logger_Custom1': { 
         'handlers':['customhandler'], 
         'level':'DEBUG', 
         'propagate':True 
          }, 
       }, 

    'formatters': { 
     'verbose': { 
      'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s' 
        }, 
     'simple': { 
      'format': '%(levelname)s %(message)s' 
        }, 
     'custom_format':{ 
      'format':'[%(asctime)s %(levelname)s T:%(threadName)s F:%(funcName)s ] %(message)s ' 
         }, 
       } 
} 

Der obige Code funktioniert gut, aber jetzt würde ich jede Lognachricht wie am Ende eine Variable haben. Etwas wie:

MyVariable = "Somelines" 
[%(asctime)s %(levelname)s T:%(threadName)s F:%(funcName)s ] %(message)s 'MyVariable 

So würde mein Protokoll den Inhalt dieser Variablen am Ende jeder Protokollierungszeile haben. Ich weiß, dass wir das innerhalb der View-Funktion wie folgt tun können: logging.warning('% before you %','Look','Leap') Aber das erfordert, dass wir diese Zeile überall getrennt hinzufügen. Wenn wir diesen Variablennamen hinzufügen oder ändern müssen, müssen wir diese Zeile überall in jeder Datei ändern.

Also ich frage mich, ob es eine Möglichkeit gibt, dies direkt von settings.py zu tun, so dass wir eine Änderung vornehmen können und es wird für alle Protokollierungsnachrichten gelten.

Antwort

3

Ich habe die Lösung selbst gefunden. Ich weiß nicht, ob das eine gute Praxis ist, aber es funktioniert.

Alles, was ich war eine Variable zugewiesen haben:

testvar = "MyVariable" 

Und dann diese Variable anhängen, wie folgt aus:

'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s ' + testvar 

Die Ausgabe der Variable in der Log-Eintrag mit dem Log-Format haben werden zusammen . Danke. Bitte lassen Sie mich wissen, ob es mehr Möglichkeiten gibt, dies zu tun.

+0

ich einen Platz am Ende der Formatierungsstring (nur nach '% (Nachricht) s') hinzugefügt, kann es auch in Ihrem aktuellen Code als hilfreich erweisen! Auf diese Weise wird zwischen der Django-Protokollnachricht und Ihrer benutzerdefinierten Nachricht ein Leerzeichen angezeigt. Beachten Sie auch, dass dies nur so lange funktioniert, wie 'testvar' eine Zeichenkette ist! Sie können es ein wenig robuster machen, indem Sie es mit der Zeichenfolgenfunktion einbinden, d. H. 'Str (testvar)'. – Hannele

+0

Hey, das sind tolle Tipps ...... Danke ... –

1

Die Protokollformat-Zeichenfolge, auf die Sie sich beziehen, enthält eine Reihe von Variablen, die vom Protokollierungsmodul bereitgestellt werden. Die vollständige Liste is here. Im Wesentlichen wird ein Wörterbuch in die Zeichenfolge zur Formatierung übergeben - und Sie können diese Liste nicht bearbeiten. Stattdessen sollten Sie Ihre Variable entweder direkt innerhalb der Formatzeichenfolge als tatsächlichen Wert "fest codieren" oder den Wert innerhalb einer Variablen in Ihrer Einstellungsdatei speichern und sie einfach anhängen.

'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s and look, custom stuff here!!!' 

Oder ..

custom = 'and look, custom stuff here!!!' 
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s ' + custom 
Verwandte Themen