2016-01-19 2 views
7

У меня есть специальный обработчик ведения журнала, который я хочу обрабатывать на всех уровнях сообщений регистрации (INFO, WARN, DEBUG, ERROR и т. Д.) И отправлять их на сервер аналитики данных. Для каждого сообщения данные будут содержать поля в записи и на исходном объекте запроса.Извлечение объекта запроса в пользовательский обработчик ведения журнала Django

Проблема в том, что я не видел объект запроса, прикрепленный к любой из записей. Я нашел в официальной документации, что только сообщения django.request имеют объект запроса, прикрепленный к записи, но не упоминают, что конкретно сообщения django.request. (https://docs.djangoproject.com/en/1.9/topics/logging/#django-request).

Что такое сообщения django.request? Как/Когда они увольняются? Как я могу перенаправить каждое сообщение о регистрации на объект запроса на нем, чтобы мой обработчик мог присоединить эти данные, которые будут отправлены на прокси-сервер?

---- Обработчик ----

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

Образец кода, представленный вами, никогда не использует обработчик журнала «splunk». Вы настроили логгер 'django.request', чтобы его обработчики были« консолью »и« обработчиком журнала ». – bignose

ответ

1

Чтобы ответить на «что такое django.request сообщение» : Регистратор django.request является одним из Python loggers provided with Django. Таким образом, сообщение django.request представляет собой сообщение журнала, отправленное на регистратор django.request. Как вы нашли, что Django documentation says:

сообщений в этом регистраторе имеют следующий дополнительный контекст:

  • status_code: код ответа HTTP, связанный с запросом.
  • request: Объект запроса, сгенерировавший сообщение регистрации.

Что не может быть очевидным, что «лишняя контекст» обеспечивается с сообщением регистрации, и эти элементы становятся атрибутами на экземпляре LogRecord.

Так что да, в указанном вами методе LogHandler.emit параметр record - это LogRecord. Атрибутом record.request будет объект HTTP-запроса, , если запись была создана на регистраторе django.request.

Ваш LogHandler будет получать сообщения только в том случае, если вы их нажмете, например, с помощью настройки Django LOGGING['loggers']['django.request']['handlers'].

Смежные вопросы