以下是我的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?”
如果您使用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
方法。
万一发生在其他人身上,请检查您是否有逗号分隔所有记录器条目,因为您可能缺少一个,并且两个字段的名称都已合并。