为什么此Django日志记录不起作用?

Ray*_*Ray 7 django logging

我在进行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)
Run Code Online (Sandbox Code Playgroud)

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

# 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)
Run Code Online (Sandbox Code Playgroud)

执行视图时,控制台中除了显示以下消息外,什么都看不到,

No handlers could be found for logger "demo.views"
Run Code Online (Sandbox Code Playgroud)

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

谢谢。

后续 我通过添加默认的“全部捕获”记录器解决了这个问题,该记录器在使用“ __name__”参数创建记录器时将被触发:

'loggers': {
    '': {
        'handlers': ['console'],
    },
    ...
Run Code Online (Sandbox Code Playgroud)

raf*_*lmp 5

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

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

def demo_logging(request, template):
    logger.error("Got some error")
    return render(request, template)
Run Code Online (Sandbox Code Playgroud)

  • 这是真的。但是,我刚刚发现的一种更好的方法可能是添加一个默认记录器,如上所示。鉴于Django doc示例在指定记录器时显示了“ \ _ \ _ name \ _ \ __”的用法,您认为它会讨论如何创建默认的“全包”记录器。 (3认同)
  • 所以它根本就失败了。不引发异常。 (2认同)