gpt4 book ai didi

Python记录器在多线程环境中多次打印相同的输出

转载 作者:行者123 更新时间:2023-12-01 05:45:59 25 4
gpt4 key购买 nike

在我的代码中,记录器以某种方式打印出事件两次,但传统的 print 显示正确的事件数量。

select 1,2
select 1,2
2013-04-19 18:37:30,618:4561354752 - SQLLogger - DEBUG - select 1,2
2013-04-19 18:37:30,618:4561354752 - SQLLogger - DEBUG - select 1,2
2013-04-19 18:37:30,618:4565561344 - SQLLogger - DEBUG - select 1,2
2013-04-19 18:37:30,618:4565561344 - SQLLogger - DEBUG - select 1,2

我不清楚为什么同一条消息在多线程情况下会多次发布。

import logging
from threading import Thread

class SQLEngine(object):
def __init__(self, DB_PATH):
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s:%(thread)d - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
self.logger = logging.getLogger('SQLLogger')
self.logger.setLevel(logging.DEBUG)
self.logger.addHandler(ch)

def execute(self,SQL,):
self.logger.debug(SQL)
print SQL

class DBWorker(Thread):
def __init__(self, name):
Thread.__init__(self)
self.name = name

def run(self):
db = SQLEngine('')
db.execute('select 1,2')

if __name__ == '__main__':
DBWorker('thread 1').start()
DBWorker('thread 2').start()

最佳答案

查看logger文档:

Loggers are never instantiated directly, but always through the module-level function logging.getLogger(name). Multiple calls to getLogger() with the same name will always return a reference to the same Logger object.

现在您的构造函数正在调用以下代码:

ch = logging.StreamHandler()
self.logger = logging.getLogger('SQLLogger')
self.logger.addHandler(ch)

请注意,您不会为每个 SQLEngine 对象创建一个新的记录器,但始终会获取对同一记录器实例的引用。这意味着您总是向同一个记录器添加处理程序,因此在创建第二个对象后,您的记录器有两个处理程序,每个处理程序都打印到屏幕上。

我们只需要注册一个处理程序(例如在 SQLEngine 构造函数之外),或者在 __init__ 中调用 getLogger每个 SQLEngine 实例都有不同的名称。

关于Python记录器在多线程环境中多次打印相同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16114538/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com