正确使用nullHandler禁用特定包的日志消息

1 投票
1 回答
2136 浏览
提问于 2025-04-18 16:44

我想要阻止一个外部模块在我的日志文件中疯狂输出信息,就像这个问题中提到的那样:禁用特定包的日志记录。下面是我根据答案灵感写的配置文件。我使用的是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。所以,当你读取这个配置时,它只会创建一个包含 fileHandlerhandlers 字典。因此,当你尝试使用 nullHandler 时,就会出现 KeyError 错误,因为字典里没有这个项。

我猜这可能是个简单的打字错误,但如果不是的话,可以查看文档中的 配置文件格式

文件必须包含名为 [loggers]、[handlers] 和 [formatters] 的部分,这些部分通过名称识别文件中定义的每种类型的实体。对于每个这样的实体,都有一个单独的部分来说明该实体是如何配置的。

换句话说,仅仅拥有一个 handler_nullHandler 部分并不会创建一个名为 nullHandler 的处理器;在 handlers 部分中包含 keys=…,nullHandler,… 才能做到这一点。

撰写回答