2009-05-01 35 views
9

Có lẽ nó không tồn tại, vì tôi không thể tìm thấy nó trong pydoc. Nhưng bằng cách sử dụng gói nhật ký của python, có cách nào để truy vấn một Trình ghi nhật ký để tìm ra số lần một hàm cụ thể được gọi không? Ví dụ: có bao nhiêu lỗi/cảnh báo đã được báo cáo?Đã bao nhiêu lần đăng nhập.error() được gọi là?

Trả lời

12

Mô-đun ghi nhật ký không xuất hiện để hỗ trợ điều này. Về lâu dài, có lẽ bạn nên tạo mô-đun mới và thêm tính năng này thông qua phân loại các mục trong mô-đun đăng nhập hiện có để thêm các tính năng bạn cần, nhưng bạn cũng có thể đạt được hành vi này khá dễ dàng với trình trang trí :

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 

Output:

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

Có một mô-đun warnings - ở mức độ nào đó - thực hiện một số điều đó.

Bạn có thể muốn thêm tính năng đếm này vào Handler tùy chỉnh. Vấn đề là có một triệu xử lý và bạn có thể muốn thêm nó vào nhiều hơn một loại.

Bạn có thể muốn thêm nó vào một Filter, vì đó là độc lập với Trình xử lý đang sử dụng.

7

Bạn cũng có thể thêm một Handler mới cho logger mà tính tất cả các cuộc gọi:

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 

Bạn có thể sau đó sử dụng đuôi dict erwards để xuất số lượng cuộc gọi.

+0

Điều này lý tưởng đối với tôi. Câu trả lời trang trí che khuất tên hàm và số dòng thực sự nơi trình ghi nhật ký được gọi. Với một trình xử lý tùy chỉnh, nó hoạt động hoàn hảo. –

Các vấn đề liên quan