Azure DevOps流水线中Python logging日志全被识别为错误如何修复
问题根因
该问题和日志本身的级别无关,核心触发原因是Python logging模块默认的StreamHandler会将所有内容输出到stderr(标准错误流):
- Azure DevOps流水线默认会将
stderr输出的所有内容统一判定为错误级别 - 绝大多数终端环境会默认将
stderr输出的内容渲染为红色
这就导致无论你打印什么级别的日志,都会被误识别为错误。
基础修复方案
核心修改是将控制台输出的流从默认的stderr改为stdout(标准输出流),同时补全日志目录自动创建逻辑,避免原代码中日期目录不存在时触发文件找不到报错。
完整修正代码如下:
import logging import sys import os from datetime import datetime # 提前创建按日期命名的日志目录 log_dir = "./logs/{:%d-%m-%Y}/".format(datetime.now()) os.makedirs(log_dir, exist_ok=True) log_file_path = os.path.join(log_dir, "{:%Y-%m-%d-%H-%M-%S}.log".format(datetime.now())) log = logging.getLogger() logging.basicConfig( handlers=[ logging.FileHandler(log_file_path, 'w', 'utf-8'), # 手动指定输出流为stdout,替换默认的stderr logging.StreamHandler(stream=sys.stdout) ], level=logging.INFO, format='[%(asctime)s] %(levelname)s - %(message)s', datefmt='%H:%M:%S' )
修改后所有控制台日志都会走标准输出流,Azure DevOps不会再将INFO/WARNING级别日志误判为错误,终端也不会把所有日志都显示为红色。
进阶优化(级别分流方案)
如果需要严格对齐流的语义:让INFO/DEBUG/WARNING级别日志走标准输出,ERROR/CRITICAL级别日志仍然走标准错误流(方便流水线做错误告警、终端单独标红错误日志),可以使用双处理器分流配置,替换上述代码中basicConfig的handler配置即可:
# 标准输出处理器:仅处理INFO到WARNING级别的日志 stdout_handler = logging.StreamHandler(stream=sys.stdout) stdout_handler.setLevel(logging.INFO) stdout_handler.addFilter(lambda record: record.levelno < logging.ERROR) stdout_handler.setFormatter( logging.Formatter('[%(asctime)s] %(levelname)s - %(message)s', datefmt='%H:%M:%S') ) # 标准错误处理器:仅处理ERROR及以上级别的日志 stderr_handler = logging.StreamHandler(stream=sys.stderr) stderr_handler.setLevel(logging.ERROR) stderr_handler.setFormatter( logging.Formatter('[%(asctime)s] %(levelname)s - %(message)s', datefmt='%H:%M:%S') ) logging.basicConfig( handlers=[ logging.FileHandler(log_file_path, 'w', 'utf-8'), stdout_handler, stderr_handler ], level=logging.INFO )
注意事项
logging.basicConfig必须在所有打印日志的代码之前调用,否则配置不会生效。
内容的提问来源于stack exchange,提问作者lukos06
相关产品推荐
相关产品推荐

