2

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

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

1 回答 1

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

于 2013-05-13T10:47:42.323 回答