2013-05-13 3 views
2

У меня многопоточное клиент-серверное программное обеспечение, и его немного сложно отладить при подключении 10 клиентов. У меня есть несколько вопросов относительно трассировки.Как я могу отслеживать многопоточное программное обеспечение?

  1. Как я могу отслеживать только определенный файл или класс в программном обеспечении?
  2. Есть ли возможность иметь журнал с меткой времени и именем функции, без какой-либо другой информации и разделенной нитями?
  3. Есть ли графический генератор трассировки?
+0

Начнем с определения. Что вы имеете в виду «отслеживание»? Отладка? – Denis

+0

Простейшим решением было бы знать, когда была вызвана функция. –

+0

Вы можете написать декоратор, который будет записывать все действия под обернутым объектом. – Denis

ответ

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

Его использование Монго в качестве хранилища, но вы можете написать любой бэкенд. Просто оберните функцию, которая вам нужна, и следуйте за журналом.

Смежные вопросы