Skip to main content
 首页 » 编程设计

python之如何跟踪多线程软件

2024年11月01日30JustinYoung

我有一个多线程客户端-服务器软件,当连接 10 个客户端时调试起来有点困难。我有几个关于追踪的问题。

  1. 如何只跟踪软件中的某个文件或类?
  2. 是否有可能拥有一个带有时间戳和函数名称的日志,没有任何其他信息并由线程分隔?
  3. 是否有图形跟踪生成器?

请您参考如下方法:

import logging 
import time 
import pymongo 
import hashlib 
import random 
 
DEBUG_MODE = True 
 
class logger(object): 
 
        def __new__(cls, *args, **kwargs): 
                if DEBUG_MODE: 
                        return object.__new__(cls, *args, **kwargs) 
                else: 
                        return args[0] 
 
        def __init__(self, foo): 
                self.foo = foo 
                logging.basicConfig(filename='exceptions.log', format='%(levelname)s %(asctime)s: %(message)s') 
                self.log = logging.getLogger(__name__) 
 
        def __call__(self, *args, **kwargs): 
                def _log(): 
                        try: 
                                t = time.time() 
                                func_hash = self._make_hash(t) 
                                col = self._make_db_connection() 
                                log_record = {'func_name':self.foo.__name__, 'start_time':t, 'func_hash':func_hash} 
                                col.insert(log_record) 
                                res = self.foo(*args, **kwargs) 
                                log_record = {'func_name':self.foo.__name__, 'exc_time':round(time.time() - t,4), 'end_time':time.time(),'func_hash':func_hash} 
                                col.insert(log_record) 
                                return res 
                        except Exception as e: 
                                self.log.error(e) 
                return _log() 
 
        def _make_db_connection(self): 
                connection = pymongo.Connection() 
                db = connection.logger 
                collection = db.log 
                return collection 
 
        def _make_hash(self, t): 
                m = hashlib.md5() 
                m.update(str(t)+str(random.randrange(1,10))) 
                return m.hexdigest() 

它使用 mongo 作为存储,但您可以编写任何后端。只需包装您需要的功能并按照日志进行操作即可。