Python中如何实现按大小自动轮转日志?代码问题求助
问题分析与解决方案
你的代码有两个核心问题导致未触发日志轮转:
- 没有通过logger执行实际的日志写入操作,RotatingFileHandler仅在写入日志时才会检查文件大小是否达到阈值。
- 手动修改日志文件后,程序启动时不会主动检测已有文件的大小,只有当第一次通过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
相关产品推荐
相关产品推荐

