bio*_*ffe 5 python io logging multithreading
在我的代码中,记录器以某种方式打印了两次事件,但常规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
Run Code Online (Sandbox Code Playgroud)
我不清楚为什么在多线程情况下会多次发布相同的消息。
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()
Run Code Online (Sandbox Code Playgroud)
查看记录器文档:
记录器永远不会直接实例化,而是始终通过模块级函数 logging.getLogger(name) 进行实例化。多次调用具有相同名称的 getLogger() 将始终返回对同一个 Logger 对象的引用。
现在您的构造函数正在调用以下代码:
ch = logging.StreamHandler()
self.logger = logging.getLogger('SQLLogger')
self.logger.addHandler(ch)
Run Code Online (Sandbox Code Playgroud)
请注意,您不会为每个SQLEngine对象创建一个新的记录器,而是始终获得对同一个记录器实例的引用。这意味着您总是向同一个记录器添加处理程序,因此在创建第二个对象后,您的记录器有两个处理程序,每个处理程序都打印到屏幕上。
你,我们需要或者注册只有一个处理器(例如外部SQLEngine构造函数)或调用getLogger在__init__与每一个不同的名称SQLEngine实例。
| 归档时间: |
|
| 查看次数: |
2159 次 |
| 最近记录: |