我有以下日志记录过滤器:
class LogFilter:
"""
Print all messages that do not equal hello."""
def filter(self, record):
print ('@@@@@@@ Filter', record)
if getattr(record, 'msg') == 'Hello':
return False
return True
def __repr__(self):
return 'LogFilter'
然后:
import logging
handler = logging.StreamHandler()
handler.addFilter(LogFilter())
logger = logging.getLogger(__name__)
logger.addHandler(handler)
我将如何删除此过滤器?例如,当我尝试:
>>> handler.removeFilter(LogFilter())
>>> handler.removeFilter(LogFilter)
>>> handler.removeFilter('LogFilter') # ????
>>> handler.filters
[LogFilter] # filter is still there.
我还有过滤器。删除过滤器(或格式化程序)的正确方法是什么?
如果您查看removeFilter
的源代码
def removeFilter(self, filter):
"""
Remove the specified filter from this handler.
"""
if filter in self.filters:
self.filters.remove(filter)
您看到您需要实际的filter
对象才能删除它。一个快速的解决办法是
import logging
handler = logging.StreamHandler()
LF = LogFilter()
handler.addFilter(LF)
logger = logging.getLogger(__name__)
logger.addHandler(handler)
然后,当您要删除过滤器时
>>> handler.removeFilter(LF)
>>> handler.filters
[]
将过滤器作为对象传递,为什么由于列表中的handler.filters
和当您正在执行handler.removeFilter('name')
而又是handler.filters.remove('name')
时却引起问题呢?>
列表无法删除过滤器值并创建值错误。因此LogFIlter停留在列表中,但是如果将filter作为对象传递并将其删除,则它可以工作
import logging
handler = logging.StreamHandler()
log_filter = LogFilter()
handler.addFilter(log_filter)
logger = logging.getLogger(__name__)
logger.addHandler(handler)