根记录器不遵守日志级别Python

时间:2019-07-28 14:58:24

标签: python

我正在努力使自己大致了解Python日志记录,并且我已经创建了一个小代码来做到这一点。

下面是我的主要代码文件:

import logging.config

logging.config.fileConfig('logging-2.conf')
logger = logging.getLogger('main')
import auxillary


logger.info("Info message from main file")
logger.warning("This is a warning message from main file")

我的日志记录配置文件如下:

[loggers]
keys=root, main

[handlers]
keys=mainhandler, roothandler

[formatters]
keys=mainformatter

[logger_root]
level=ERROR
handlers = roothandler

[logger_main]
level=DEBUG
handlers=mainhandler
qualname=main
propagate=1

[handler_roothandler]
class=StreamHandler
args=(sys.stdout,)

[handler_mainhandler]
class=FileHandler
formatter=mainformatter
args=("main.log",)

[formatter_mainformatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s

以下是auxillary.py文件的代码:

import logging

module_logger = logging.getLogger('main.auxiliary')

module_logger.info("Info statement from auxillary function")
module_logger.warning("warning message from auxillary function")

当我运行以下代码时,输​​出为:

Info statement from auxillary function
warning message from auxillary function
Info message from main file
This is a warning message from main file

我的main.log文件的内容如下:

2019-07-28 16:52:05,710 - main.auxiliary - INFO - Info statement from auxillary function
2019-07-28 16:52:05,710 - main.auxiliary - WARNING - warning message from auxillary function
2019-07-28 16:52:05,710 - main - INFO - Info message from main file
2019-07-28 16:52:05,710 - main - WARNING - This is a warning message from main file

换句话说,即使将root记录程序的日志级别设置为ERROR后,它也将打印所有消息。

知道为什么会这样吗?我应该如何强制root记录器仅打印来自错误及以上错误的消息,即使对它的传播是正确的。

1 个答案:

答案 0 :(得分:0)

这是因为,当记录器收到其级别或更高级别的消息时,会将消息转发给其处理程序和其祖先处理程序

import logging


root_logger = logging.getLogger() # WARNING by default
sub_logger = logging.getLogger('a')
sub_logger.setLevel('INFO')

root_console = logging.StreamHandler()
root_logger.addHandler(root_console)
sub_console = logging.StreamHandler()
sub_logger.addHandler(sub_console)

sub_logger.info('This message is going to the handlers of sub_logger and its ancestor root_logger, thus printed twice')

root_logger.removeHandler(root_console)

sub_logger.info('Again, same logic but root logger no longer has handlers, so printed only once')