我有一个脚本可以导入一个日志记录模块(基于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()
方法生成的。为什么会这样?
答案 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
,并且每个日志消息都会打印两次。