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 に答える