在记录模块中避免使用单例模式

时间:2017-03-27 13:45:40

标签: python

例如,我有一些脚本test1.py,代码如下:

import logging
from logging.handlers import RotatingFileHandler
import some_module

handler = RotatingFileHandler('TEST1.log', maxBytes=18000, backupCount=7) 
logger = logging.getLogger(__name__)
logger.addHandler(handler)
logging.getLogger("some_module").addHandler(handler)

do_something():
some_module.do_smth()

do_something()

我还有另一个脚本test2.py,代码如下:

import logging
from logging.handlers import RotatingFileHandler
import some_module

handler = RotatingFileHandler('TEST2.log', maxBytes=18000, backupCount=7) 
logger = logging.getLogger(__name__)
logger.addHandler(handler)
logging.getLogger("some_module").addHandler(handler)

do_something():
some_module.do_smth_else()

do_something()

然后我导入文件app.py中的两个脚本,由于某些原因可以调用其中一个脚本。

问题是,来自脚本test1.py的模块some_module的所有日志消息都写入两个日志文件:和TEST1.log以及TEST2.log。

据我了解,问题在于单例模式,因此模块日志记录就像我的所有脚本的全局模块一样,它们在同一个进程中工作。因此,当我将test1.py导入app.py时,它首次为some_module添加处理程序,然后,当我将test2.py导入app.py时,它会再次为some_module添加处理程序,此模块现在有2个处理程序。 / p>

是否可以单独为此模块添加处理程序,因此test1.py调用的所有调试消息都将在TEST1.log中编写,但不会在TEST2.log中编写。

更新:

在我的情况下,我试图用这个module来做这件事,而且看起来,它没有用它:

logging.getLogger("TeleBot.test1").setLevel(logging.DEBUG)
logging.getLogger("TeleBot.test1").addHandler(handler)

我的日志文件中没有写任何内容,但如果我只是这样做:

logging.getLogger("TeleBot").setLevel(logging.DEBUG)
logging.getLogger("TeleBot").addHandler(handler)

它正在工作,但正如我在问题中所提到的,它会将调试消息写入所有文件。 那么,这个特定模块中的错误是什么?

1 个答案:

答案 0 :(得分:1)

在两个文件中执行logging.getLogger("some_module")会返回与您已观察到的相同的Logger对象。

要在每个文件中单独Logger,只需在每次getLogger()中提供不同的名称。

E.g。在test1.py

logging.getLogger("some_module.test1").addHandler(handler)

并在test2.py

logging.getLogger("some_module.test2").addHandler(handler)