以下是我的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?”
答案 0 :(得分: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
是加载您传入的.ini
文件的configparser
我能想到的唯一原因是explicit is better than implicit,因此它会强制您准确地声明您想要对根记录器做什么,以防您认为它会做一些魔术。虽然我认为这不是一个特别好的理由。这可能只是某人当时认为这样做的方式。如果你做了一些further reading:
fileConfig()API比dictConfig()API旧,并且没有提供覆盖日志记录某些方面的功能[... N]注意未来的配置功能增强将添加到dictConfig(),所以它是值得考虑的是,在方便的情况下转换到这个新的API。
如果您考虑dictConfig
docs,您似乎无需提供root
记录器。
因此,似乎 需要指定根处理程序,除了向后兼容性之外没有其他正当理由。如果你想绕过它,你必须在Python文件中指定你的设置或导入一个JSON文件并使用dictConfig
方法。
答案 1 :(得分:0)
以防万一发生在其他人身上,请检查您是否有逗号分隔所有记录器条目,因为您可能缺少一个,并且两个字段的名称都已合并。