思路:为logger设置2个handler,再对2个handler设置不同的filter进行日志过滤。
通过supervisor管理项目时,会有stdout和stderr两种日志路径的设置方式,通过给一个logger设置2个StreamHandler后,分别对handler设置日志级别的过滤,实现日志的分级输出。
import logging
import sys
log = logging.getLogger('test')
log_handler_info = logging.StreamHandler(sys.stdout)
log_handler_err = logging.StreamHandler(sys.stderr)
info_filter = logging.Filter()
info_filter.filter = lambda record: record.levelno < logging.WARNING # 设置过滤等级
err_filter = logging.Filter()
err_filter.filter = lambda record: record.levelno >= logging.WARNING
log_handler_info.addFilter(info_filter)
log_handler_err.addFilter(err_filter)
log.addHandler(log_handler_info)
log.addHandler(log_handler_err)
log.setLevel("INFO")
log.debug("debug")
log.info("info")
log.warning("warning")
log.error("error")
同时通过log.setLevel避免了比INFO级别更低日志的写入。
代码中info_filter会输出INFO级别的日志,err_filter会输出WARNING和更高级别的日志。
运行代码结果如下