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

时间:2015-02-26 08:45:04

标签: python logging configuration ini

以下是我的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?”

2 个答案:

答案 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)

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