У меня есть специальный обработчик ведения журнала, который я хочу обрабатывать на всех уровнях сообщений регистрации (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,
},
}
}
Образец кода, представленный вами, никогда не использует обработчик журнала «splunk». Вы настроили логгер 'django.request', чтобы его обработчики были« консолью »и« обработчиком журнала ». – bignose