You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何实现按大小自动轮转日志?代码问题求助

问题分析与解决方案

你的代码有两个核心问题导致未触发日志轮转:

  1. 没有通过logger执行实际的日志写入操作,RotatingFileHandler仅在写入日志时才会检查文件大小是否达到阈值。
  2. 手动修改日志文件后,程序启动时不会主动检测已有文件的大小,只有当第一次通过logger写入日志时才会进行检查。

正确实现代码

下面是满足你需求的完整代码:

import logging
import time
from logging.handlers import RotatingFileHandler

def create_rotating_log(path):
    # 获取logger实例,避免重复添加handler
    logger = logging.getLogger("Rotating Log")
    logger.setLevel(logging.INFO)
    
    # 防止多次调用函数时重复添加handler,避免同一条日志被多次写入
    if logger.handlers:
        return logger
    
    # 配置日志格式(可选,让日志内容更规范易读)
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    
    # 1GB = 1024*1024*1024字节
    max_log_size = 1 * 1024 * 1024 * 1024
    handler = RotatingFileHandler(
        path,
        maxBytes=max_log_size,
        backupCount=1,
        encoding='utf-8'
    )
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    return logger

if __name__ == "__main__":
    log_file = "test.log"
    logger = create_rotating_log(log_file)
    
    # 模拟每3秒追加日志内容
    count = 0
    while True:
        logger.info(f"这是第{count}条测试日志,用于填充文件触发轮转")
        count += 1
        time.sleep(3)

关键说明

  • 轮转触发逻辑:只有通过logger.info()(或其他日志级别方法)写入日志时,RotatingFileHandler才会检查当前文件大小。若写入后文件超过maxBytes,会自动将原文件重命名为test.log.1,再创建新的test.log写入后续日志。
  • 程序重启场景:如果重启程序时,现有test.log的大小已经超过阈值,第一次写入日志时会立即触发轮转,不会继续往大文件追加内容。
  • 重复handler问题:加入if logger.handlers:判断,避免多次调用日志创建函数时重复添加handler,导致日志重复输出。

内容的提问来源于stack exchange,提问作者noob_coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 02:45:31