为什么我会收到重复的日志消息?

时间:2014-11-04 08:01:22

标签: python logging

我有一个脚本可以导入一个日志记录模块(基于logging)和另一个模块(后者又导入与主要模块相同的日志记录模块 - 以使脚本和模块具有一致的日志记录)。

除了我收到重复的消息外,一切正常。以下是针对问题部分的脚本:

主要脚本。它设置了一个日志处理程序,用于他的

方法
# the main script
# it is the one started

import dslogger
import mytestmodule

class MyClass():
    def __init__(self):
        self.log = dslogger.DSLogger().rootLogger

    def dosomething(self):
        self.log.debug("hello from dosomething")

mytestmodule.MyTestModule()
MyClass().dosomething()

mytestmodule 。这里剥离了__init__

# mytestmodule.py

import dslogger

class MyTestModule():
    def __init__(self):
        self.log = dslogger.DSLogger().rootLogger
        self.log.debug("hello from mytestmodule")

dslogger.py,日志记录模块

import logging

class DSLogger():
    def __init__(self):
        logFormatter = logging.Formatter("%(asctime)s [%(funcName)s] [%(levelname)s]  %(message)s")
        self.rootLogger = logging.getLogger(__name__)
        consoleHandler = logging.StreamHandler()
        consoleHandler.setFormatter(logFormatter)
        self.rootLogger.setLevel(logging.DEBUG)
        self.rootLogger.addHandler(consoleHandler)

运行主脚本时,我得到:

2014-11-04 08:56:59,637 [__init__] [DEBUG]  hello from mytestmodule
2014-11-04 08:56:59,637 [dosomething] [DEBUG]  hello from dosomething
2014-11-04 08:56:59,637 [dosomething] [DEBUG]  hello from dosomething

第二行和第三行是重复的,即使它们是由主脚本中只调用一次的dosomething()方法生成的。为什么会这样?

1 个答案:

答案 0 :(得分:1)

这里发生的是您将两个StreamHandler添加到同一个记录器中。

您初始化DSLogger()两次。每次初始化时,都会调用self.rootLogger = logging.getLogger(__name__)。但是这个不会为你提供两个不同的记录器实例,因为它们是用相同的__name__调用的:

import logging
x = logging.getLogger('x')
id(x)
Out[42]: 173704528L

y = logging.getLogger('x')
id(y)
Out[44]: 173704528L

因此,当您致电self.log.debug("hello from mytestmodule")时,这是在DSLogger()被初始化一次之后,因此只有一个StreamHandler被添加到该记录器中。但是,当您初始化MyClass时,会添加另一个,因此记录器现在有两个StreamHandler,并且每个日志消息都会打印两次。