将django.request记录到文件而不是控制台

时间:2014-12-19 10:09:09

标签: python django logging

我正在尝试配置我的django settings.py以正确使用python日志记录工具,但我偶然发现了一个相当奇怪的问题:

即使在阅读docs之后,我也无法找到如何将控制台打印的调试请求行从Django重定向到我指定的文件;以下是我的日志记录配置的一部分。

LOGGING = {
    'version': 1,
    'formatters': {
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    }
    'handlers': {
        'file_http': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': r'C:\mysystem-http.log',
            'formatter': 'verbose'
        }
    },
    'loggers': {
        'django.request': {
            'handlers': ['file_http'],
            'level': 'DEBUG',
            'propagate': False
        }
    }
}

我一直看到以下格式的控制台打印行:

[19/Dec/2014 11:48:03] "POST /api/v1/ HTTP/1.1" 200 10

如何使用日志工具将这些文件重定向到文件?

提前致谢

3 个答案:

答案 0 :(得分:6)

manage.py runserver未对[19/Dec/2014 11:48:03] "POST /api/v1/ HTTP/1.1" 200 10等消息使用日志记录系统。而不是这样,runserver使用sys.stderr(和其他消息的sys.stdout)。如果您确实需要将其重定向到文件,则可以覆盖sys.stderr settings.py。示例 - 将sys.stderr记录到文件和控制台:

import sys

class Logger(object):
    def __init__(self):
        self.console = sys.stderr
        self.file = open("runserver.log", "a", 0)

    def write(self, msg):
        self.console.write(msg)
        self.file.write(msg)

sys.stderr = Logger()

在write方法中,您也可以使用日志记录系统通过LOGGING设置来处理它。

更新

在Django 1.10中,runserver输出通过日志记录: https://docs.djangoproject.com/en/dev/releases/1.10/#runserver-output-goes-through-logging

答案 1 :(得分:3)

这些输出由HTTP服务器处理(如果以开发模式运行,则来自标准库的WSGIServer)。

settings.py的配置与此无关。

答案 2 :(得分:0)

@dikamilo的答案是正确的。

在Django 1.10之前,manage.py runserver运行了Django自己的WSGIServer实现,该实现已登录到sys.stderr。

settings.py中添加以下代码将对runserver所使用的WSGIRequestHandler进行猴子补丁,以便通过名称为django.server的日志记录模块记录所有请求,以便大致模拟行为Django 1.10以上版本。

###############################################################################
# SUPER-JANK PATCH FOR DJANGO RUNSERVER LOGGING PRIOR TO VERSION 1.10
###############################################################################
#
# Add this to settings.py
#
import logging
from django.core.servers.basehttp import WSGIRequestHandler
logger = logging.getLogger('django.server')
def log_message(self, format, *args):
    # Don't bother logging requests for admin images or the favicon.
    if self.path.startswith(self.admin_static_prefix) or self.path == '/favicon.ico':
        return
    msg = format % args
    if args[1][0] in ['1', '4', '5']:
        logger.warn(msg)
    else:
        logger.info(msg)

WSGIRequestHandler.log_message = log_message

它取代了log_message方法,该方法负责实际写入stderr

添加此补丁后,您可以像通常一样通过LOGGING中的settings.py配置日志记录。