RotatingFileHandler达到maxBytes阈值未自动创建新文件问题排查
问题原因分析
- 日志写入量未达触发阈值:你设置的
maxBytes为100字节,只有接口被调用时才会写入日志,单条日志包含时间戳、内容后大概在几十字节,若接口调用次数少、累计写入量未超过阈值,自然不会触发滚动逻辑。 - basicConfig配置失效:如果代码中在调用
logging.basicConfig之前已经有其他地方初始化过logging配置,basicConfig会直接跳过执行,对应的RotatingFileHandler配置不会生效。 - 多进程写入冲突:如果你的Web服务是多进程部署(比如gunicorn/uvicorn开启了多worker),
RotatingFileHandler仅保证线程安全、不保证进程安全,多个进程同时写同一个日志文件会导致滚动判定逻辑紊乱。
修复方案
- 首先验证基础滚动逻辑是否正常,单独运行以下测试脚本,确认滚动功能本身是否生效:
import logging from logging.handlers import RotatingFileHandler # 显式给logger添加handler,不依赖basicConfig避免优先级问题 logger = logging.getLogger("DemoLogger") logger.setLevel(logging.INFO) # 避免重复添加handler if not logger.handlers: rotate_handler = RotatingFileHandler("./app.log", maxBytes=100, backupCount=5) log_formatter = logging.Formatter("%(asctime)s - %(message)s") rotate_handler.setFormatter(log_formatter) logger.addHandler(rotate_handler) # 循环写入日志触发滚动 for i in range(100): logger.info(f"测试日志内容 {i}")
运行后检查目录下是否生成app.log.1、app.log.2这类归档文件,若能生成说明基础配置无问题,问题出在服务运行场景。
多进程场景适配:如果是多进程部署的Web服务,选择以下任一方案解决进程安全问题:
- 替换为
ConcurrentRotatingFileHandler(需提前安装concurrent-log-handler依赖包),原生支持多进程安全的日志滚动 - 给每个进程配置独立的日志文件,避免多进程写入同一个文件
- 将日志上报到统一的日志采集服务,在服务侧做归档滚动,不在业务进程内处理滚动逻辑
- 替换为
调整
maxBytes到合理阈值:当前设置的100字节过小,生产环境建议设置为10*1024*1024即10MB这类合理值,避免频繁触发滚动影响服务性能。
内容的提问来源于stack exchange,提问作者Sagabarnisa S
相关产品推荐
相关产品推荐

