【问题标题】:Logging django.request to file instead of console将 django.request 记录到文件而不是控制台
【发布时间】:2015-02-18 06:01:48
【问题描述】:

我正在尝试配置我的 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

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

提前致谢

【问题讨论】:

标签: python django logging


【解决方案1】:

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

与你settings.py的配置无关。

【讨论】:

  • 对。那么,有没有办法使用日志记录工具重定向该库的输出?
  • 这取决于你的堆栈。
【解决方案2】:

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

【讨论】:

  • 这比 bash 重定向更好吗?
  • 简单,不是更好(可能原因之一是您可以同时登录到文件+控制台并添加过滤器/格式化程序等)。
【解决方案3】:

@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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多