Python logging如何为特定目的地按严重级别配置多种日志格式
实现不同日志等级集合对应不同输出格式的方案
完全可以实现你的需求,目前有两种常用的落地方式,以下是具体说明和可直接运行的示例代码。
方案1:为同一输出目标绑定多个Handler(原生推荐方案)
单个Handler确实仅支持绑定一个Formatter,你可以给同一个输出目的地(比如标准输出stdout)添加多个Handler,每个Handler通过过滤器限制仅处理指定等级集合的日志,再分别绑定对应格式的Formatter即可。
import logging import sys from logging import Filter # 定义只处理INFO等级的过滤器 class InfoOnlyFilter(Filter): def filter(self, record): return record.levelno == logging.INFO # 定义处理除INFO外所有等级的过滤器 class NonInfoFilter(Filter): def filter(self, record): return record.levelno != logging.INFO # 初始化Logger logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) # 全局等级设为你需要捕获的最低等级 # 配置INFO等级专用Handler info_handler = logging.StreamHandler(sys.stdout) info_handler.setLevel(logging.INFO) info_handler.addFilter(InfoOnlyFilter()) info_formatter = logging.Formatter("【INFO提示】 %(asctime)s | %(message)s") info_handler.setFormatter(info_formatter) # 配置其他等级通用Handler other_handler = logging.StreamHandler(sys.stdout) other_handler.setLevel(logging.DEBUG) other_handler.addFilter(NonInfoFilter()) other_formatter = logging.Formatter("%(levelname)s | %(asctime)s | 行号:%(lineno)d | %(message)s") other_handler.setFormatter(other_formatter) # 把两个Handler都挂载到Logger上 logger.addHandler(info_handler) logger.addHandler(other_handler) # 测试 logger.debug("调试信息") logger.info("普通通知") logger.warning("警告信息") logger.error("报错信息")
方案2:自定义Formatter动态切换格式
如果不想挂载多个Handler,可以直接重写Formatter的format方法,根据日志等级动态匹配对应的输出格式,代码更简洁:
import logging import sys class LevelDiffFormatter(logging.Formatter): # 定义各等级集合对应的格式 INFO_FORMAT = "【INFO提示】 %(asctime)s | %(message)s" DEFAULT_FORMAT = "%(levelname)s | %(asctime)s | 行号:%(lineno)d | %(message)s" def format(self, record): # 按等级切换格式 if record.levelno == logging.INFO: self._style._fmt = self.INFO_FORMAT else: self._style._fmt = self.DEFAULT_FORMAT return super().format(record) # 初始化Logger logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) handler = logging.StreamHandler(sys.stdout) handler.setFormatter(LevelDiffFormatter()) logger.addHandler(handler) # 测试效果和方案1完全一致 logger.debug("调试信息") logger.info("普通通知") logger.warning("警告信息")
- 如果你需要划分更多等级集合,只要调整过滤器的判断条件、或者自定义Formatter里的格式匹配规则即可,比如要把DEBUG和INFO归为一组、WARNING/ERROR/CRITICAL归为另一组,修改对应的等级判断逻辑就可以实现。
内容的提问来源于stack exchange,提问作者freeman
相关产品推荐
相关产品推荐

