我可以在没有root logger的情况下使用logging.ini文件吗?

问题描述 投票:6回答:2

以下是我的logging.ini文件的样子:

[loggers]
keys=teja

[handlers]
keys=fileHandler

[formatters]
keys=simpleFormatter

[logger_teja]
level=DEBUG
handlers=fileHandler
qualname=tejaLogger

[handler_fileHandler]
class=logging.FileHandler
level=DEBUG
formatter=simpleFormatter
args=("error.log", "w")

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

我收到以下错误:

File "test.py", line 22, in <module>
    logging.config.fileConfig('logging.ini')
  File "/usr/lib/python2.7/logging/config.py", line 79, in fileConfig
    _install_loggers(cp, handlers, disable_existing_loggers)
  File "/usr/lib/python2.7/logging/config.py", line 183, in _install_loggers
    llist.remove("root")
ValueError: list.remove(x): x not in list

请帮我解决问题。或者请解释一下“为什么总是需要包含root logger?”

python logging configuration ini
2个回答
3
投票

如果您使用use the source,您将看到必须配置根记录器:

# configure the root first
llist = cp["loggers"]["keys"]
llist = llist.split(",")
llist = list(map(lambda x: x.strip(), llist))
llist.remove("root")
section = cp["logger_root"]
root = logging.root
log = root

(其中cp是加载你传入的configparser文件的.ini

我能想到的唯一原因是explicit is better than implicit,所以它强迫你准确地声明你想用根记录器做什么,万一你认为它会做一些魔术。虽然我认为这不是一个特别好的理由。这可能只是某人当时认为这样做的方式。如果你做一些further reading

fileConfig()API比dictConfig()API旧,并且不提供涵盖日志记录的某些方面的功能[... N]注意未来的配置功能增强将添加到dictConfig(),因此值得考虑转换在方便的时候使用这个更新的API。

如果你考虑dictConfig docs,似乎你不必提供root记录器。

所以看起来你需要指定一个根处理程序,除了向后兼容性之外没有其他正当理由。如果你想解决这个问题,你必须在Python文件中指定你的设置或者导入一个JSON文件并使用dictConfig方法。


0
投票

万一发生在其他人身上,请检查您是否有逗号分隔所有记录器条目,因为您可能缺少一个,并且两个字段的名称都已合并。

© www.soinside.com 2019 - 2024. All rights reserved.