我正在尝试使用Python组装一个记录器。我在2.6工作,所以我不能使用新的字典样式方法,而是使用旧的老式配置文件。问题是,填充输出两次到控制台,我不明白为什么。这是我的测试脚本:
import logging
import logging.config
if __name__ == "__main__":
logging.config.fileConfig("newSlogger.conf")
slogger = logging.getLogger("sloggerMain")
slogger.debug("dbg msg")
slogger.info("herp derp dominae")
这是我的配置文件:
[loggers]
keys=root,sloggerMain,sloggerSecondary
[handlers]
keys=consoleHandler,infoFileHandler,debugFileHandler
[formatters]
keys=consoleFormatter,infoFileFormatter,debugFileFormatter
[logger_root]
handlers=consoleHandler
level=NOTSET
[logger_sloggerMain]
handlers=consoleHandler,infoFileHandler,debugFileHandler
level=DEBUG
qualname=sloggerMain
[logger_sloggerSecondary]
handlers=consoleHandler,infoFileHandler,debugFileHandler
level=DEBUG
qualname=sloggerSecondary
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
format=consoleFormatter
args=(sys.stdout,)
[handler_infoFileHandler]
class=FileHandler
level=INFO
formatter=infoFileFormatter
args=("testlog.log", "w")
[handler_debugFileHandler]
class=FileHandler
level=DEBUG
formatter=debugFileFormatter
args=("testlogdbg.log", "w")
[formatter_consoleFormatter]
format=%(name)s: %(asctime)s %(levelname)s %(message)s
datefmt=%Y-%m-%d %H:%M:%S
[formatter_infoFileFormatter]
format=%(name)s: %(asctime)s %(levelname)s %(message)s
datefmt=%Y-%m-%d %H:%M:%S
[formatter_debugFileFormatter]
format=%(name)s: %(asctime)s %(levelname)s %(message)s
datefmt=%Y-%m-%d %H:%M:%S
[formatter_syslogFormatter]
format=%(name)s: %(asctime)s %(levelname)s %(message)s
datefmt=%Y-%m-%d %H:%M:%S
有什么想法吗?
答案 0 :(得分:39)
更改非根记录器以将propagate
设置为0,以防止消息传播到根记录器:
[logger_sloggerMain]
handlers=consoleHandler,infoFileHandler,debugFileHandler
level=DEBUG
qualname=sloggerMain
propagate=0
logging
模块的docs说:
子记录器将消息传播到 与他们相关的处理程序 祖先记录器。因此,它 没有必要定义和配置 所有记录器的处理程序 应用程序使用这足够了 为顶级配置处理程序 记录器和创建子记录器 需要的。
sloggerMain
记录器是root
记录器的子项。默认情况下,发送到该记录器的消息也会向上传播。
您也可以简单地禁用root日志记录来解决问题:
[logger_root]
handlers=