我正在努力使自己大致了解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记录器仅打印来自错误及以上错误的消息,即使对它的传播是正确的。
答案 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')