繁体   English   中英

root logger不尊重日志级Python

[英]root logger not respecting log level 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

换句话说,即使在为根记录器设置日志级别为ERROR之后,它也会打印所有消息。

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

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

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')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM