为啥这个 Django 日志记录不起作用?

Posted

技术标签:

【中文标题】为啥这个 Django 日志记录不起作用?【英文标题】:Why doesn't this Django logging work?为什么这个 Django 日志记录不起作用? 【发布时间】:2016-12-07 03:21:34 【问题描述】:

我在使用 Django 日志记录时遇到了麻烦。我已经阅读了有关日志记录的 Python 和 Django 文档,但我仍然没有看到我做错了什么。首先,当我执行这个简单的视图时,我只是想在运行 Django 开发服务器的控制台中记录一条消息:

# demo/views.py
import logging
logger = logging.getLogger(__name__)

def demo_logging(request, template):
    logger.error("Got some error")
    return render(request, template)

我在我的设置文件中使用 django/utils/log.py 中指定的 Django 的默认日志记录设置,以便我(希望)确切地知道发生了什么(显然我不知道):

# settings.py
DEBUG = True
...
LOGGING_CONFIG = None
LOGGING = 
    'version': 1,
    'disable_existing_loggers': False,
    'filters': 
        'require_debug_false': 
            '()': 'django.utils.log.RequireDebugFalse',
        ,
        'require_debug_true': 
            '()': 'django.utils.log.RequireDebugTrue',
        ,
    ,
    'handlers': 
        'console': 
            'level': 'INFO',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
        ,
        'null': 
            'class': 'logging.NullHandler',
        ,
        'mail_admins': 
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        
    ,
    'loggers': 
        'django': 
            'handlers': ['console'],
        ,
        'django.request': 
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': False,
        ,
        'django.security': 
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': False,
        ,
        'py.warnings': 
            'handlers': ['console'],
        ,
    

import logging.config
logging.config.dictConfig(LOGGING)

当我执行视图时,除了消息之外,我在控制台中看不到任何内容,

No handlers could be found for logger "demo.views"

我不明白我做错了什么。我认为调用 logger.error 会命中链接到定义的控制台处理程序的 django 记录器。

谢谢。

跟进 我通过添加一个默认的“catch-all”记录器解决了这个问题,该记录器将在使用“__name__”参数创建记录器时触发:

'loggers': 
    '': 
        'handlers': ['console'],
    ,
    ...

【问题讨论】:

【参考方案1】:

调用logger = logging.getLogger(__name__) 会导致logging 模块搜索名为您的模块(demo.views)的记录器;由于您没有按该名称定义的记录器,因此它失败了。要简单地登录到控制台,您可以使用 LOGGING 配置的 'loggers' 键中定义的 django 记录器:

import logging
logger = logging.getLogger('django')

def demo_logging(request, template):
    logger.error("Got some error")
    return render(request, template)

【讨论】:

这是真的。但是,我刚刚发现的一种更好的方法可能是添加一个默认记录器,如上所示。鉴于 Django 文档示例在指定记录器时显示了“__name__”的使用,您会认为它会讨论创建默认的“catch-all”记录器。 是的,我同意你的看法,这让人想知道为什么文档没有提到这一点,或者为什么默认情况下不添加“全能”记录器。 所以它只是失败了。不引发异常。 @rafalmp 我有点晚了,还有一个愚蠢的问题,只是在 settings.py 中设置django logger 将来自控制台的所有日志存储到带有file 处理程序的文件中,或者它仅存储我们从视图或相关位置存储的那些。相同的设置在本地机器上工作正常,但不要使用 APACHE 记录生产中的所有 INFO 级别日志。

以上是关于为啥这个 Django 日志记录不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

弹簧安全返回 403,日志记录不起作用

MagicalRecord release/3.0 - 日志记录不起作用

假装日志不起作用

带有 Linux 日志记录的 Azure Web 应用程序不起作用

覆盖节点 eventEmitter.on 并关闭日志记录不起作用

在 django 生产中记录所有 sql 查询是个好主意吗?