Python记录器将事情记录两次到cons

2024-09-28 17:23:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图用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

有什么想法吗?


Tags: namedebugformatmessageformatterlogginghandlerslevel
1条回答
网友
1楼 · 发布于 2024-09-28 17:23:48

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

[logger_sloggerMain]
handlers=consoleHandler,infoFileHandler,debugFileHandler
level=DEBUG
qualname=sloggerMain
propagate=0

logging模块的docs表示:

Child loggers propagate messages up to the handlers associated with their ancestor loggers. Because of this, it is unnecessary to define and configure handlers for all the loggers an application uses. It is sufficient to configure handlers for a top-level logger and create child loggers as needed.

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

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

[logger_root]
handlers=

相关问题 更多 >