django logging - django.request 记录器和额外的上下文

Posted

技术标签:

【中文标题】django logging - django.request 记录器和额外的上下文【英文标题】:django logging - django.request logger and extra context 【发布时间】:2012-05-04 17:53:46 【问题描述】:

我在 django 1.3.,python 2.6

在此处的 django 文档中https://docs.djangoproject.com/en/1.3/topics/logging/#django-request 它说消息具有以下额外上下文:状态和请求。 你如何让这些显示在调试文件中?我在我的日志配置中尝试了类似的东西:

'formatters':         
        'simple_debug': 
            'format': '[%(asctime)s] %(levelname)s %(module)s %(message)s %(request.user)s',        
        
    ,

但这会导致整体日志记录失败(即没有发生日志记录输出)


编辑: 因此,在提交问题后,我立即遇到了这个问题: http://groups.google.com/group/django-users/browse_thread/thread/af682beb1e4af7f6/ace3338348e92a21

有人可以帮忙解释/详细说明

文档中所有引用的真正意思是里面的所有地方 在使用 django.request 的 django 中,请求是明确的 作为额外的一部分传入。

request 是作为 extra to 的一部分显式传入的?

【问题讨论】:

【参考方案1】:

django-requestlogging middleware plugin 可以轻松记录与请求相关的信息,而无需调整所有记录调用以添加 requestextra 参数。然后只需配置您的记录器即可。

使用 django-requestlogging 时可以记录以下项目:

用户名 http_user_agent 路径信息 remote_add request_method server_protocol

【讨论】:

请求始终设置为无。你能帮忙吗? @brki 像魅力一样工作。我认为这是比上述解决方案更好的解决方案,因为我不必更改所有现有日志。【参考方案2】:

您不能在格式字符串中使用request.user,因为 %-formatting 无法处理该问题。您可以使用格式字符串,例如

'[%(asctime)s] %(levelname)s %(module)s %(message)s %(user)s'

并且,在您的日志调用中,使用类似

logger.debug('My message with %s', 'args', extra='user': request.user)

extra dict 被合并到日志事件记录中,以 user 属性结束,然后通过格式字符串获取并出现在日志中。

如果使用django.request 记录器,则状态码和请求将由Django 在extra 字典中传递。如果您需要request.user,您可能需要添加一个logging.Filter,它执行以下操作:

class RequestUserFilter(logging.Filter):
    def filter(self, record):
        record.user = record.request.user
        return True

这样您就可以在格式化的输出中显示用户。

【讨论】:

如果我不想在生产环境中使用logger.debug(*) 方法

以上是关于django logging - django.request 记录器和额外的上下文的主要内容,如果未能解决你的问题,请参考以下文章

Django-Memsql 初始迁移错误

Django - 从静态文件夹提供 SPA

Django - AJAX - 为啥我需要 url 参数?

Django - 带有序列化程序的可选字段

Django中Logging日志配置

Django 错误:关系 django_admin_log 的权限被拒绝