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

Python 将django.request记录到文件而不是控制台,python,django,logging,Python,Django,Logging,我正在尝试配置djangosettings.py以正确使用python日志功能,但我遇到了一个相当奇怪的问题: 即使在阅读了之后,我也无法找到如何将控制台打印的调试请求行从Django重定向到我指定的文件;下面是我的日志配置的一部分 LOGGING = { 'version': 1, 'formatters': { 'simple': { 'format': '%(levelname)s %(message)s' },

我正在尝试配置django
settings.py
以正确使用python日志功能,但我遇到了一个相当奇怪的问题:

即使在阅读了之后,我也无法找到如何将控制台打印的调试请求行从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

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


提前感谢

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


settings.py
的配置与此无关。

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方法中,您还可以使用日志记录系统通过日志记录设置来处理此问题

更新:

在Django 1.10中,runserver输出通过日志记录: 的答案是正确的

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

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

###############################################################################
#1.10版之前DJANGO RUNSERVER日志记录的SUPER-JANK修补程序
###############################################################################
#
#将此添加到settings.py
#
导入日志记录
从django.core.servers.basehttp导入WSGIRequestHandler
logger=logging.getLogger('django.server')
def log_消息(自身、格式、*args):
#不要麻烦记录管理员映像或favicon的请求。
如果self.path.startswith(self.admin\u static\u前缀)或self.path='/favicon.ico':
返回
msg=格式%args
如果['1','4','5']中的args[1][0]:
logger.warn(msg)
其他:
logger.info(msg)
WSGIRequestHandler.log\u message=log\u message
它取代了负责实际写入
stderr
的方法


添加此修补程序后,您可以通过
settings.py

中的
logging
正常配置日志记录。那么,有没有一种方法可以使用日志功能重定向该库的输出?这取决于您的堆栈。这比bash重定向好多少?很简单,它并不好(可能原因之一是您可以同时登录到文件+控制台并添加过滤器/格式化程序等)。仅供记录:如果您有多进程设置,登录到文件可能不是一个好主意,cf