2016-01-19 22 views
7

Ho un gestore di registrazione personalizzato che desidero gestire tutti i livelli dei messaggi di registrazione (INFO, WARN, DEBUG, ERROR, ecc.) E inviarlo a un server di analisi dei dati. Per ogni messaggio, i dati includeranno i campi sul record e sull'oggetto di richiesta originale.Recupero dell'oggetto di richiesta in un gestore di logging Django personalizzato

Il problema è che non ho visto l'oggetto richiesta collegato a nessuno dei record. Ho trovato nella documentazione ufficiale che solo i messaggi di django.request hanno l'oggetto richiesta allegato al record, ma non menzionano cosa siano specificamente i messaggi di django.request. (https://docs.djangoproject.com/en/1.9/topics/logging/#django-request).

Che cosa sono i messaggi di django.request? Come/quando vengono licenziati? Come posso reindirizzare ogni messaggio di registrazione per avere l'oggetto richiesta su di esso in modo che il gestore possa allegare i dati che verranno inviati a un server proxy?

---- ---- gestore

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

Il codice di esempio che si presenta non utilizza mai il gestore di registri "splunk". Hai configurato il logger 'django.request' in modo che i suoi gestori siano 'console' e 'loghandler'. – bignose

risposta

1

Per rispondere a una “cosa è un messaggio django.request” : Il logger django.request è uno dei Python loggers provided with Django. Quindi, un messaggio django.request è un messaggio di registro inviato al logger django.request. Come hai trovato, i Django documentation says:

I messaggi a questo logger hanno la seguente contesto in più:

  • status_code: Il codice di risposta HTTP associato alla richiesta.
  • request: l'oggetto richiesta che ha generato il messaggio di registrazione.

Ciò che non può essere evidente è che “contesto extra” è fornito con il messaggio di registrazione, e questi elementi diventano attributi nell'istanza LogRecord.

Quindi sì, nel metodo LogHandler.emit definito, il parametro record è LogRecord. L'attributo record.request sarà l'oggetto richiesta HTTP, se il record è stato creato nel logger django.request.

Il tuo LogHandler riceverà i messaggi solo se li indirizzi direttamente, ad esempio tramite l'impostazione Django LOGGING['loggers']['django.request']['handlers'].