使用三个版本(class、函数、lambda)来设置日志过滤器
Using three version (class, function, lambda) for setting logging Filter
我可以用三种不同的方式创建相同的过滤器:
1) 作为 lambda:
import logging
handler = logging.StreamHandler()
handler.addFilter(lambda record: getattr(record, 'msg') == 'Hello')
logger = logging.getLogger(__name__)
logger.addHandler(handler)
logger.warning('ok!')
2) 作为函数:
def is_hello(record):
return getattr(record, 'msg') == 'Hello'
import logging
handler = logging.StreamHandler()
handler.addFilter(is_hello)
logger = logging.getLogger(__name__)
logger.addHandler(handler)
logger.warning('ok!')
3) 作为 class
class LogFilter:
def filter(self, record):
return getattr(record, 'msg') == 'Hello'
import logging
handler = logging.StreamHandler()
handler.addFilter(LogFilter())
logger = logging.getLogger(__name__)
logger.addHandler(handler)
logger.warning('ok!')
loggin 模块如何允许这种变化,过滤器是否会做类似的事情:
if callable(provider_filter):
provider_filter(record)
else:
provider_filter.filter(record)
或者'know'是调用函数还是调用class方法之一?
基本上,是的,它只是检查它是否具有 .filter
属性,如果没有,它假定它是可调用的:
def filter(self, record):
"""
Determine if a record is loggable by consulting all the filters.
The default is to allow the record to be logged; any filter can veto
this and the record is then dropped. Returns a zero value if a record
is to be dropped, else non-zero.
.. versionchanged:: 3.2
Allow filters to be just callables.
"""
rv = True
for f in self.filters:
if hasattr(f, 'filter'):
result = f.filter(record)
else:
result = f(record) # assume callable - will raise if not
if not result:
rv = False
break
return rv
我可以用三种不同的方式创建相同的过滤器:
1) 作为 lambda:
import logging
handler = logging.StreamHandler()
handler.addFilter(lambda record: getattr(record, 'msg') == 'Hello')
logger = logging.getLogger(__name__)
logger.addHandler(handler)
logger.warning('ok!')
2) 作为函数:
def is_hello(record):
return getattr(record, 'msg') == 'Hello'
import logging
handler = logging.StreamHandler()
handler.addFilter(is_hello)
logger = logging.getLogger(__name__)
logger.addHandler(handler)
logger.warning('ok!')
3) 作为 class
class LogFilter:
def filter(self, record):
return getattr(record, 'msg') == 'Hello'
import logging
handler = logging.StreamHandler()
handler.addFilter(LogFilter())
logger = logging.getLogger(__name__)
logger.addHandler(handler)
logger.warning('ok!')
loggin 模块如何允许这种变化,过滤器是否会做类似的事情:
if callable(provider_filter):
provider_filter(record)
else:
provider_filter.filter(record)
或者'know'是调用函数还是调用class方法之一?
基本上,是的,它只是检查它是否具有 .filter
属性,如果没有,它假定它是可调用的:
def filter(self, record):
"""
Determine if a record is loggable by consulting all the filters.
The default is to allow the record to be logged; any filter can veto
this and the record is then dropped. Returns a zero value if a record
is to be dropped, else non-zero.
.. versionchanged:: 3.2
Allow filters to be just callables.
"""
rv = True
for f in self.filters:
if hasattr(f, 'filter'):
result = f.filter(record)
else:
result = f(record) # assume callable - will raise if not
if not result:
rv = False
break
return rv