2012-04-24 8 views
9

Am auf django 1.3, Python 2.6django Logging - django.request Logger und extra Kontext

In der django docs hier
https://docs.djangoproject.com/en/1.3/topics/logging/#django-request
es sagt, dass Nachrichten, die den folgenden zusätzlichen Kontext haben: Status und Anfrage.
Wie erhalten Sie diese in der Debug-Datei angezeigt? Ich habe versucht, in meinem Logging Config so etwas wie:

'formatters': {   
     'simple_debug': { 
      'format': '[%(asctime)s] %(levelname)s %(module)s %(message)s %(request.user)s',   
     } 
    }, 

aber die bewirkt, dass die Gesamt-Protokollierung fehlschlagen (dh keine Protokollausgabe geschieht)


EDIT: So unmittelbar nach der Frage der Einreichung i über das kam: http://groups.google.com/group/django-users/browse_thread/thread/af682beb1e4af7f6/ace3338348e92a21

jemand auf

012.351 erklären/aufwendigen helfen

Alle das Zitat aus der Dokumentation bedeutet wirklich, dass alle Orte innerhalb von django, wo django.request verwendet wird, ist die Anfrage explizit als Teil der zusätzlichen übergeben.

Wo wird die Anfrage explizit als Teil von extra an?

Antwort

19

Sie können request.user nicht in der Formatzeichenfolge verwenden, da% -Formatierung das nicht behandelt. Sie könnten einen Format-String wie

'[%(asctime)s] %(levelname)s %(module)s %(message)s %(user)s' 

und in Ihrem Logging-Aufruf verwenden, verwenden Sie so etwas wie

logger.debug('My message with %s', 'args', extra={'user': request.user}) 

Die extra dict in die Logging-Ereignisaufzeichnung zusammengeführt werden, die mit einem user Attribute endet , und dies wird dann über die Formatzeichenfolge abgerufen und im Protokoll angezeigt.

Wenn Sie den Logger django.request verwenden, wird der status_code und die Anforderung in extra dict von Django übergeben. Wenn Sie die request.user benötigen, müssen Sie wahrscheinlich eine logging.Filter hinzuzufügen, die etwas tut, wie:

class RequestUserFilter(logging.Filter): 
    def filter(self, record): 
     record.user = record.request.user 
     return True 

, so dass Sie den Benutzer in der formatierten Ausgabe zu zeigen.

+0

ah! das macht total Sinn. Danke. –

0

Die django-requestlogging middleware plugin macht es einfach, anforderungsbezogene Informationen zu protokollieren, ohne all Ihre Protokollierungsaufrufe anzupassen, um request mit dem Parameter extra hinzuzufügen. Es ist dann nur eine Frage der Konfiguration Ihrer Logger.

Die folgenden Elemente können protokolliert werden, wenn django-Request mit:

  • Benutzername
  • HTTP_USER_AGENT
  • path_info
  • remote_add
  • REQUEST_METHOD
  • SERVER_PROTOCOL