2009-05-01 14 views
9

Quizás es simplemente que no existe, ya que no puedo encontrarlo en pydoc. Pero al usar el paquete de registro de Python, ¿hay alguna manera de consultar un registrador para averiguar cuántas veces se llamó a una función en particular? Por ejemplo, ¿cuántos errores/advertencias se informaron?¿Cuántas veces se llamó a logging.error()?

Respuesta

12

El módulo de registro no parece ser compatible con esto. A largo plazo, probablemente sería mejor crear un nuevo módulo y agregar esta característica mediante la subclasificación de los elementos en el módulo de registro existente para agregar las características que necesita, pero también podría lograr este comportamiento con bastante facilidad con un decorador :

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 

salida:

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

Hay un módulo warnings que, en cierta medida, hace algo de eso.

Es posible que desee agregar esta función de conteo a un Handler personalizado. El problema es que hay un millón de controladores y es posible que desee agregarlo a más de un tipo.

Es posible que desee agregarlo a un Filter, ya que es independiente de los manipuladores en uso.

7

también puede agregar un nuevo manejador al registrador que cuenta con todas las llamadas:

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 

a continuación, puede utilizar la popa dict erwards para dar salida a la cantidad de llamadas.

+0

Esto fue ideal para mí. La respuesta del decorador sombreó el verdadero nombre de la función y el número de línea desde donde se llamó al registrador. Con un controlador personalizado, funcionó perfectamente. –

Cuestiones relacionadas