正确使用nullHandler禁用特定包的日志消息
我想要阻止一个外部模块在我的日志文件中疯狂输出信息,就像这个问题中提到的那样:禁用特定包的日志记录。下面是我根据答案灵感写的配置文件。我使用的是python3.2。
我的问题是,这个方法不管用:'handlers=nullHandler'这一行报错了:
Traceback (most recent call last):
File "./tree_browser", line 44, in <module>
logging.config.fileConfig('../log/logging.conf')
File "/usr/lib/python3.2/logging/config.py", line 79, in fileConfig
_install_loggers(cp, handlers, disable_existing_loggers)
File "/usr/lib/python3.2/logging/config.py", line 202, in _install_loggers
log.addHandler(handlers[hand])
KeyError: 'nullHandler'
而且我找不到使用这个nullHandler的方法。我的配置文件是:
[loggers]
keys=root,RPIO
[handlers]
keys=fileHandler
[formatters]
keys=defaultFormatter
[logger_root]
level=DEBUG
handlers=fileHandler
[logger_RPIO]
level=NOTSET
handlers=nullHandler
qualname=_RPIO.py
propagate=0
[handler_nullHandler]
class=NullHandler
level=DEBUG
[handler_fileHandler]
class=FileHandler
level=DEBUG
formatter=defaultFormatter
filemode=w
args=('../log/pilberry_core.log',)
[formatter_defaultFormatter]
format=%(asctime)s %(filename)s: %(funcName)s: %(message)s
datefmt=%Y/%m/%d %H:%M:%S
我尝试过的其他方法也失败了:我试着不定义[handler_nullHandler],用nullHandler或NullHandler作为格式化器,结果总是一样的错误。
需要注意的是,如果我禁用RPIO_logger(通过从[loggers]键部分移除RPIO),那么其他部分就能正常工作。
那么,使用nullHandler的正确方法是什么呢?
1 个回答
2
在你的 handlers
部分,你只列出了 fileHandler
。所以,当你读取这个配置时,它只会创建一个包含 fileHandler
的 handlers
字典。因此,当你尝试使用 nullHandler
时,就会出现 KeyError
错误,因为字典里没有这个项。
我猜这可能是个简单的打字错误,但如果不是的话,可以查看文档中的 配置文件格式:
文件必须包含名为 [loggers]、[handlers] 和 [formatters] 的部分,这些部分通过名称识别文件中定义的每种类型的实体。对于每个这样的实体,都有一个单独的部分来说明该实体是如何配置的。
换句话说,仅仅拥有一个 handler_nullHandler
部分并不会创建一个名为 nullHandler
的处理器;在 handlers
部分中包含 keys=…,nullHandler,…
才能做到这一点。