python的logging模块中,Filters
可被 Handlers
和 Loggers
用来实现比按层级提供更复杂的过滤操作。
一、在代码中定义及使用Filter
先给一个直接使用的示例:
import logging
logger = logging.getLogger('dev')
hdl = logging.StreamHandler()
fmt = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
hdl.setFormatter(fmt)
# 重写过滤器类
class MyFilter(logging.Filter):
def __init__(self, name):
super().__init__(name=name)
def filter(self, record):
if record.levelno <= logging.WARNING:
return True
return False
flt = MyFilter('dev')
# 将过滤器应用到hdl处理程序
hdl.addFilter(flt)
logger.addHandler(hdl)
# 将过滤器应用到logger日志器
# logger.addFilter(flt)
logger_test1 = logging.getLogger('dev.test1')
logger.debug("This is a debug log.")
logger.info("This is an info log.")
logger.warning("This is a warning log.")
logger.error("This is an error log.")
logger.critical("This is a critical log.")
logger_test1.debug("This is a debug log.")
logger_test1.info("This is an info log.")
logger_test1.warning("This is a warning log.")
logger_test1.error("This is an error log.")
logger_test1.critical("This is a critical log.")
运行代码,输出:
2023-08-20 22:49:40,849 - dev - WARNING - This is a warning log.
2023-08-20 22:49:40,849 - dev.test1 - WARNING - This is a warning log.
解释:
- 定义了一个
MyFilter
类,根据filter
(record) 返回值决定是否要记录指定的记录?返回零表示否,非零表示是。示例中表示过滤掉高于logging.WARNING
级别的日志。实例化MyFilter
时,传了一个dev
参数,它表示将对dev
名称的日志器生效,然后将过滤器应用到处理程序hdl
,然后hdl
应用到logger
日志器。 - 输出结果中只有
WARNING
级别的日志,这是因为没有给logger
、logger_test1
单独设置level
级别,因此它默认使用了root
根日志级别