如何跟踪多线程软件?

时间:2013-05-13 10:27:32

标签: python multithreading debugging trace

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

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

1 个答案:

答案 0 :(得分:2)

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作为存储,但你可以编写任何后端。只需包装您需要的功能并按照日志。