2013-05-13 37 views
2

我有一個多線程客戶端服務器軟件,並且在連接10個客戶端時調試有點困難。關於追蹤,我有幾個問題。如何追蹤多線程軟件?

  1. 如何追蹤軟件中的某個文件或類?
  2. 有沒有可能有一個日誌與時間戳和函數名稱,沒有任何其他信息和線程分隔?
  3. 是否有圖形跟蹤生成器?
+0

讓我們從定義開始。 「跟蹤」是什麼意思?調試? – Denis 2013-05-13 10:41:02

+0

最簡單的解決方案是知道什麼時候被調用。 – 2013-05-13 10:42:42

+0

你可以編寫一個裝飾器,它將記錄包裝對象下的所有動作。 – Denis 2013-05-13 10:44:49

回答

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() 

它的使用蒙戈作爲存儲,但你可以寫任何後端。只需包裝你需要的功能並按照日誌。