17

我在 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 内部使用 django.request 的所有地方,请求作为额外的一部分显式传递。

作为额外内容的一部分,请求在哪里显式传递?

4

2 回答 2

28

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

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

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

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

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

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

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

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

于 2012-04-24T08:57:52.933 回答
6

django-requestlogging 中间件插件可以轻松记录与请求相关的信息,而无需调整所有日志调用以添加request参数extra。然后只需配置您的记录器即可。

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

  • 用户名
  • http_user_agent
  • 路径信息
  • 远程添加
  • 请求方法
  • 服务器协议
于 2015-12-02T09:23:02.557 回答