2009-05-01 2 views
9

Возможно, этого просто не существует, поскольку я не могу найти его в pydoc. Но используя пакет регистрации python, есть ли способ запросить Logger, чтобы узнать, сколько раз вызывалась определенная функция? Например, сколько сообщений об ошибках/предупреждениях было сообщено?Сколько раз вызывал logging.error()?

ответ

12

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

class callcounted(object): 
    """Decorator to determine number of calls for a method""" 

    def __init__(self,method): 
     self.method=method 
     self.counter=0 

    def __call__(self,*args,**kwargs): 
     self.counter+=1 
     return self.method(*args,**kwargs) 


import logging 
logging.error=callcounted(logging.error) 
logging.error('one') 
logging.error('two') 
print logging.error.counter 

Выход:

ERROR:root:one 
ERROR:root:two 
2 
0

Там warnings модуль, который - в некоторой степени - делает некоторые из этого.

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

Возможно, вы захотите добавить его в Filter, так как это не зависит от используемых Обработчиков.

7

Вы также можете добавить новый обработчик к регистратору, который подсчитывает все вызовы:

class MsgCounterHandler(logging.Handler): 
    level2count = None 

    def __init__(self, *args, **kwargs): 
     super(MsgCounterHandler, self).__init__(*args, **kwargs) 
     self.level2count = {} 

    def emit(self, record): 
     l = record.levelname 
     if (l not in self.level2count): 
      self.level2count[l] = 0 
     self.level2count[l] += 1 

Вы можете использовать в Словаре корму для вывода количества вызовов.

+0

Это было идеально для меня. Ответ декоратора затенял истинное имя функции и номер строки, из которой был вызван регистратор. С пользовательским обработчиком он работал отлично. –

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