如果没有 basicConfig,日志处理程序将无法工作

ref*_*fik 1 python logging java.util.logging

我有一个 Flask Web 应用程序,Python 日志记录配置是在应用程序启动时通过dictConfig完成的。用于将某些日志写入数据库的处理程序附加到 logger 'test.module' 对该记录器生成的日志仅logging.basicConfig(level=logging.DEBUG)在应用程序启动时也被调用时才会写入数据库。否则不会将日志写入数据库。我知道 basicConfig 只是将一个 streamHandler 附加到根记录器。我认为这应该无关紧要,因为我不希望 root 记录器做任何事情。为什么没有 basicConfig 这不起作用?

我在下面添加了我如何启动记录器和我的配置。

class DbHandler(logging.Handler):
    def __init__(self, level=logging.NOTSET):
        logging.Handler.__init__(self, level)

    def emit(self, record):
        record.message = self.format(record)
        log = DbModel()
        log.message = record.message
        log.save()


LOGGING = {
    'version': 1,
    'handlers': {
        'db_log': {
            'level': 'DEBUG',
            'class': 'test.handlers.DbHandler',
        },
    },
    'loggers': {
        'test.important_module': {
            'handlers': [
                'db_log'
            ],
    },
}

# logging.basicConfig(level=logging.DEBUG) # Doesnt work without this
logging.config.dictConfig(LOGGING)

logger = logging.getLogger('test.important_module')
logger.info('Making a test')
Run Code Online (Sandbox Code Playgroud)

ise*_*dev 5

您没有为 'test.important_module' 记录器本身设置级别(您只为处理程序设置了级别)。

你可以这样做:

logger = logging.getLogger('test.important_module')
logger.setLevel(logging.DEBUG)
Run Code Online (Sandbox Code Playgroud)

或者像这样:

'loggers': {
    'test.important_module': {
        'level': 'DEBUG',         # <<< HERE
        'handlers': [
            'db_log'
        ],
},
Run Code Online (Sandbox Code Playgroud)