Python Logger将两次日志记录到控制台

the*_*tro 13 python logging

我正在尝试使用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")
Run Code Online (Sandbox Code Playgroud)

这是我的配置文件:

[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
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Bri*_*per 39

将非root记录器更改为设置propagate为0,以防止消息传播到根记录器:

[logger_sloggerMain]
handlers=consoleHandler,infoFileHandler,debugFileHandler
level=DEBUG
qualname=sloggerMain
propagate=0
Run Code Online (Sandbox Code Playgroud)

logging模块的文档说:

子记录器将消息传播到与其祖先记录器关联的处理程序.因此,不必为应用程序使用的所有记录器定义和配置处理程序.为顶级记录器配置处理程序并根据需要创建子记录器就足够了.

sloggerMain记录器是一个孩子root记录.默认情况下,发送到该记录器的消息也会向上传播.

您还可以简单地禁用根日志记录来解决问题:

[logger_root]
handlers=
Run Code Online (Sandbox Code Playgroud)