Python实现每周滚动日志:批处理传参及默认值配置问题
Python 每周滚动日志实现方案
核心思路
logging.basicConfig 无法直接实现复杂的滚动策略,要用 logging.handlers.TimedRotatingFileHandler 实现按周滚动的日志逻辑,同时用 argparse 处理批处理传入的参数,支持可选日志名称(不传时用默认值)。
实现步骤
1. Python 日志脚本 (log_rotator.py)
import logging from logging.handlers import TimedRotatingFileHandler import argparse import os def setup_logger(log_path, log_name="app.log"): # 自动创建日志目录(不存在时) os.makedirs(log_path, exist_ok=True) log_file = os.path.join(log_path, log_name) # 初始化logger实例 logger = logging.getLogger("weekly_rotator") logger.setLevel(logging.INFO) # 避免重复添加handler导致日志重复输出 if logger.handlers: logger.handlers.clear() # 配置每周滚动的handler:when="W0" 表示每周一触发滚动,interval=1 每周执行一次 handler = TimedRotatingFileHandler( log_file, when="W0", interval=1, backupCount=4, # 保留最近4周的历史日志 encoding="utf-8" ) # 设置日志格式 formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") handler.setFormatter(formatter) logger.addHandler(handler) return logger if __name__ == "__main__": # 解析命令行参数 parser = argparse.ArgumentParser(description="每周滚动日志工具") parser.add_argument("log_path", help="日志存储路径") parser.add_argument("log_name", nargs="?", default="app.log", help="日志文件名(可选,默认值为app.log)") args = parser.parse_args() # 初始化日志器并输出测试日志 logger = setup_logger(args.log_path, args.log_name) logger.info("每周滚动日志服务启动") logger.warning("这是一条测试警告日志")
2. 批处理文件 (run_log.bat)
@echo off :: 用法示例1:传入日志路径和自定义日志名 :: python log_rotator.py "D:\project_logs" "my_service.log" :: 用法示例2:仅传入日志路径,使用默认日志名 python log_rotator.py "D:\project_logs" pause
关键细节说明
- 滚动时间配置:
when="W0"指定每周一执行日志滚动,若需要周日滚动可改为when="W6";backupCount控制保留的历史日志数量,超出上限会自动删除最旧的日志文件。 - 参数处理逻辑:
argparse的nargs="?"让日志名称成为可选参数,不传参时自动使用预设的默认值。 - 重复输出规避:每次初始化日志器前清空已存在的handler,防止多次运行脚本时日志重复输出。
- 目录兼容性:用
os.makedirs(..., exist_ok=True)确保日志路径不存在时自动创建,避免因目录缺失报错。
测试验证
- 将Python脚本和批处理文件放在同一目录下。
- 修改批处理中的日志路径为实际存储路径,运行批处理。
- 查看指定路径下的日志文件,到设置的滚动时间(如周一)时,会自动生成新的日志文件,旧日志会以
日志名.日期的格式保留。
内容的提问来源于stack exchange,提问作者stack
相关产品推荐
相关产品推荐

