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

use*_*853 7 python django logging request

我有一个自定义日志处理程序,我想处理所有日志消息级别(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)
Run Code Online (Sandbox Code Playgroud)

----- ----- 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,
        },
    }
}
Run Code Online (Sandbox Code Playgroud)

big*_*ose 1

要回答 \xe2\x80\x9cdjango.request消息是什么\xe2\x80\x9d:记录器是Django 提供的 Python 记录器django.request之一。因此,消息是发送到记录器的日志消息。正如您所发现的,Django 文档说django.requestdjango.request

\n\n
\n

发送至此记录器的消息具有以下额外上下文:

\n\n
    \n
  • status_code:与请求关联的 HTTP 响应代码。
  • \n
  • request:生成日志消息的请求对象。
  • \n
\n
\n\n

可能不明显的是 \xe2\x80\x9cextra context\xe2\x80\x9d 随日志消息一起提供,并且这些项目成为LogRecord

\n\n

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

\n\n

仅当您将消息定向到那里时,您LogHandler才会收到消息,例如通过 Django 设置LOGGING[\'loggers\'][\'django.request\'][\'handlers\']

\n