如何使用.yaml文件配置Python logging仅输出指定级别的日志
可行配置方案
1. 修改Python代码,新增自定义过滤器
要实现指定级别单独过滤,需要先定义自定义过滤器类,放在配置加载逻辑之前:
import logging import logging.config import yaml # 仅放行INFO级别日志的过滤器 class InfoOnlyFilter(logging.Filter): def filter(self, record): return record.levelno == logging.INFO with open('logging.yaml', 'rt') as f: config = yaml.safe_load(f.read()) logging.config.dictConfig(config) logger = logging.getLogger('module1') # 测试代码 logger.debug('debug message') logger.info('info message') logger.warning('warn message') logger.error('error message') logger.critical('critical message')
2. 修改logging.yaml配置
version: 1 # 注册自定义过滤器 filters: info_only: () : __main__.InfoOnlyFilter formatters: simple: format: '{asctime} : {name} : {levelname} : {message}' style: '{' handlers: # 控制台处理器:仅输出INFO级别 console: class: logging.StreamHandler level: INFO formatter: simple filters: [info_only] stream: ext://sys.stdout # 文件处理器:输出WARNING及以上级别 file_handler: class: logging.FileHandler level: WARNING formatter: simple filename: logfile.log encoding: utf-8 loggers: module1: level: DEBUG handlers: [console, file_handler] propagate: no # 修正原配置拼写错误,原拼写propogate无效 root: level: DEBUG handlers: [console, file_handler]
配置说明
- yaml中的
()是dictConfig的专用语法,用于指定自定义类的实例化路径,如果你将InfoOnlyFilter定义在其他模块,将__main__替换为对应模块名即可 - 控制台处理器通过
info_only过滤器限制仅输出INFO级别,不会输出更高等级的WARNING、ERROR等日志 - 文件处理器直接设置
level: WARNING,会自动捕获WARNING、ERROR、CRITICAL三个级别的日志写入文件 - 原配置的
propogate为拼写错误,修正为propagate后可避免日志重复输出问题
运行代码后,控制台仅会打印INFO级别的日志,logfile.log文件中会保存WARNING、ERROR、CRITICAL三类日志,完全匹配需求。
内容的提问来源于stack exchange,提问作者Ahmad Ismail
相关产品推荐
相关产品推荐

