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

时间:2012-04-24 05:17:33

标签: python django logging django-settings

am on 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中,请求是明确的   作为额外的一部分传入。

请求显式传入请求作为额外的一部分?

2 个答案:

答案 0 :(得分:24)

您无法在格式字符串中使用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记录器,则status_code和请求将由Django在extra dict中传递。如果您需要request.user,则可能需要添加logging.Filter,其中包含以下内容:

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

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

答案 1 :(得分:2)

django-requestlogging middleware plugin可以轻松记录与请求相关的信息,而无需调整所有日志记录调用,即可添加request extra参数。这只是配置记录器的问题。

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

  • 用户名
  • HTTP_USER_AGENT
  • PATH_INFO
  • remote_add
  • REQUEST_METHOD
  • SERVER_PROTOCOL