gpt4 book ai didi

python - 在自定义 Django 日志记录处理程序中检索请求对象

转载 作者:太空狗 更新时间:2023-10-29 21:58:17 27 4
gpt4 key购买 nike

我有一个自定义日志处理程序,我想处理所有日志消息级别(INFO、WARN、DEBUG、ERROR 等)并将其发送到数据分析服务器。对于每条消息,数据将包括记录和原始请求对象上的字段。

问题是我没有看到附加到任何记录的请求对象。我在官方文档中发现只有 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,
},
}
}

最佳答案

回答“什么是django.request 消息”:django.request 记录器是Python loggers provided with Django 之一。 .因此,django.request 消息是发送到 django.request 记录器的日志消息。如您所见,Django documentation says :

Messages to this logger have the following extra context:

  • status_code: The HTTP response code associated with the request.
  • request: The request object that generated the logging message.

可能不太明显的是,“额外上下文”随日志消息一起提供,这些项目成为 LogRecord 实例的属性。

是的,在您定义的LogHandler.emit 方法中,record 参数是LogRecordrecord.request 属性将是 HTTP 请求对象,如果记录是在 django.request 记录器上创建的。

您的 LogHandler 只会在您将消息定向到那里时接收消息,例如通过 Django 设置 LOGGING['loggers']['django.request']['handlers'].

关于python - 在自定义 Django 日志记录处理程序中检索请求对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34886267/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com