2016-01-19 4 views
7

Ich verfüge über einen benutzerdefinierten Protokollierungshandler, mit dem alle Protokollierungsebenen (INFO, WARN, DEBUG, ERROR usw.) verarbeitet und an einen Datenanalyseserver gesendet werden sollen. Für jede Nachricht enthalten die Daten Felder im Datensatz und im ursprünglichen Anforderungsobjekt.Abrufen des Anforderungsobjekts in einem benutzerdefinierten Django-Protokollierungshandler

Das Problem ist, dass ich das Anforderungsobjekt, das keinem der Datensätze beigefügt ist, nicht gesehen habe. Ich fand auf der offiziellen Dokumentation, dass nur django.request Nachrichten haben das Anfrageobjekt an den Datensatz angehängt, aber keine Erwähnung, was speziell django.request Nachrichten sind. (https://docs.djangoproject.com/en/1.9/topics/logging/#django-request).

Was sind django.request-Nachrichten? Wie/Wann werden sie gefeuert? Wie kann ich jede Logging-Nachricht umleiten, um das Anfrageobjekt darauf zu haben, damit mein Handler die Daten anhängen kann, die an einen Proxy-Server gesendet werden?

---- ---- Handler

class LogHandler(logging.Handler): 
    request = None 

    def __init__(self, request=None): 
     logging.Handler.__init__(self) 

    def parse_record_to_json(self, record): 
     import json 

     created = datetime.datetime.fromtimestamp(record.created) 
     return { 
      'timestamp': created.strftime('%m/%d/%Y %H:%M:%S'), 
      'method': record.funcName, 
      'level': record.levelname, 
      'line': record.lineno, 
      'module': record.module, 
      'message': record.getMessage(), 
      'path': record.pathname, 
     } 

    def emit(self, record): 
     user_id = None 
     try: 
      self.request = record.request 
      if self.request.user.is_authenticated(): 
       user_id = self.request.user.id 
     except: 
      print "this must not be a django.request message" 
      self.request = None 

     from .event import SendEvent 
     json_record = self.parse_record_to_json(record) 
     level = json_record.pop('level', None) 

     SendEvent(key="server_log", 
        name=level, 
        request=self.request, 
        obj=json_record, 
        user=user_id) 

----- ----- settings.py

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'formatters': { 
     'standard': { 
      'format': '%(levelname)s %(name)s %(asctime)s %(filename)s:%(lineno)s] %(message)s', 
     }, 
    }, 
    'handlers': { 
     'console': { 
      'class': 'logging.StreamHandler', 
      'formatter': 'standard', 
     }, 
     'null': { 
      'level': 'DEBUG', 
      'class': 'django.utils.log.NullHandler', 
     }, 
     'splunk':{ 
      'class':'proj.common.handlers.LogHandler', 

     } 
    }, 
    # 'root': { 
    #  'handlers': ['console', 'loghandler',], 
    #  'level': 'INFO', 
    #  'formatter':'standard', 
    # }, 
    'loggers': { 
     'django':{ 
      'handlers':['console'], 
      'level':'INFO', 
      'formatter':'standard', 
     }, 
     'py.warnings':{ 
      'handlers': ['null',], 
      'propagate': False, 
     }, 
     'django.request':{ 
      'handlers':['console','loghandler'], 
      'propogate':False, 
     }, 
    } 
} 
+0

Der Beispielcode, den Sie verwenden, verwendet niemals Ihren 'Splunk' Log-Handler. Sie haben den Logger 'django.request' so konfiguriert, dass die Handler 'console' und 'loghandler' sind. – bignose

Antwort

1

zu beantworten, die „Was ist eine django.request Meldung“ : Der django.request Logger ist einer der Python loggers provided with Django. Eine 10 Nachricht ist eine Protokollnachricht, die an den Logger django.request gesendet wird. Wie Sie gefunden haben, die Django documentation says:

Nachrichten zu diesem Logger haben folgende zusätzliche Kontext:

  • status_code: Der HTTP-Antwortcode der Anforderung zugeordnet.
  • request: Das Anforderungsobjekt, das die Protokollierungsnachricht generiert hat.

Was kann nicht offensichtlich ist, dass „extra Kontext“ mit der Logging-Nachricht zur Verfügung gestellt, und diese Elemente werden Attribute auf der LogRecord Instanz.

Also ja, in der LogHandler.emit Methode, die Sie definiert haben, ist der record Parameter der LogRecord. Das record.request Attribut ist das HTTP-Anforderungsobjekt , wenn der Datensatz auf dem.Logger erstellt wurde.

Ihre LogHandler empfängt nur Nachrichten, wenn Sie sie dorthin leiten, z. B. über die Django-Einstellung LOGGING['loggers']['django.request']['handlers'].

Verwandte Themen