Python/Django 根日志记录器级别

9 投票
1 回答
3896 浏览
提问于 2025-04-16 23:08

在我的Django项目中,我有以下的日志配置:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'verbose': {
            'format': '%(name)s %(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'handlers': {
        'null': {
            'level': 'DEBUG',
            'class':'django.utils.log.NullHandler',
        },
        'sentry': {
            'level': 'DEBUG',
            'class': 'sentry.client.handlers.SentryHandler',
            'formatter': 'verbose'
        },
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose'
        }
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'level': 'INFO',
            'propagate': False,
        },
        '': {
            'level': 'ERROR',
            'handlers': ['console'],
        },
    },
}

当我运行 manage.py migrate 时,控制台里还是出现了很多调试信息,比如:

DEBUG south 2011-08-08 11:22:23,847 generic 19539 140735078710464 south execute "..."

我希望控制台里只显示错误信息,因为我把根日志的级别设置成了错误(ERROR)。我哪里做错了呢?

更新

看起来问题出在 south.logger 模块上:

import sys
import logging
from django.conf import settings

# Create a dummy handler to use for now.
class NullHandler(logging.Handler):
    def emit(self, record):
        pass

_logger = logging.getLogger("south")
_logger.addHandler(NullHandler())
_logger.setLevel(logging.DEBUG)

在我去掉 _logger.setLevel(logging.DEBUG) 之后,日志就正常工作了。

有人能解释一下为什么会出现这种奇怪的情况吗?

1 个回答

12

South的开发者其实不应该把最顶层的日志记录器级别设置为DEBUG。实际上,如果他们根本不设置这个级别,它会自动继承根日志记录器的级别,而这个级别通常是由应用程序的开发者来定义的(我想在这个情况下就是你)。

我建议你在相关的South论坛上把这个问题报告为一个bug。

撰写回答