Python 如何跟踪多线程软件?

Python 如何跟踪多线程软件?,python,multithreading,debugging,trace,Python,Multithreading,Debugging,Trace,我有一个多线程的客户机-服务器软件,当连接10个客户机时,调试有点困难。关于追踪我有几个问题 如何仅跟踪软件中的某个文件或类 是否可能有一个带有时间戳和函数名的日志,而没有任何其他信息,并且由线程分隔 有图形跟踪生成器吗 它使用mongo作为存储,但您可以编写任何后端。只需包装您需要的函数并按照日志操作。让我们从定义开始。“追踪”是什么意思?调试?最简单的解决方案是知道函数何时被调用。您可以编写decorator,它将记录包装对象下的所有操作。 import logging import tim

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

  • 如何仅跟踪软件中的某个文件或类
  • 是否可能有一个带有时间戳和函数名的日志,而没有任何其他信息,并且由线程分隔
  • 有图形跟踪生成器吗

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

    让我们从定义开始。“追踪”是什么意思?调试?最简单的解决方案是知道函数何时被调用。您可以编写decorator,它将记录包装对象下的所有操作。
    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()