Python记录器将日志重复记录到控制台

13

我正在尝试使用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

有什么想法吗?

1个回答

42

将非根记录器的 propagate 设置为0,以防止消息向上传播到根记录器:

[logger_sloggerMain]
handlers=consoleHandler,infoFileHandler,debugFileHandler
level=DEBUG
qualname=sloggerMain
propagate=0
logging模块的文档中提到:

子日志记录器会将消息传播到其祖先日志记录器相关联的处理程序。因此,不需要为应用程序使用的所有日志记录器定义和配置处理程序,仅需为顶级日志记录器配置处理程序,并根据需要创建子日志记录器即可。

sloggerMain日志记录器是root日志记录器的子级。默认情况下,发送到该记录器的消息也向上传播。

您还可以直接禁用根记录以解决问题:

[logger_root]
handlers=

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接