如何用TimedRotatingFileHandler自定义日志文件时间戳命名格式?
解决TimedRotatingFileHandler自定义日志文件名格式问题
你的问题出在TimedRotatingFileHandler默认的滚动命名逻辑上:它会把当前写入的日志文件作为基础名,滚动归档时给文件名追加时间后缀,导致生成初始文件名.时间戳的格式,和你期望的时间戳_.log不符。
不用在午夜重置handler,这个方案确实繁琐不优雅,利用handler的namer属性就能完美解决——这个属性允许你自定义滚动后日志文件的命名规则。
修改后的完整代码
import logging from logging.handlers import TimedRotatingFileHandler import os import re import time logger = logging.getLogger('my_logger') logger.setLevel(logging.DEBUG) logger.handlers.clear() # 避免重复添加handler log_dir = 'logs' os.makedirs(log_dir, exist_ok=True) # 确保日志目录存在 # 初始日志文件名简化为临时名称,滚动时由namer处理最终命名 log_file = os.path.join(log_dir, 'temp.log') # 配置按秒滚动的日志处理器,保留0个备份(直接重命名而非保留备份) handler = TimedRotatingFileHandler( log_file, when='s', interval=1, backupCount=0, encoding='utf-8' ) handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')) # 自定义namer函数,转换滚动后的文件名格式 def custom_namer(default_name): # 默认滚动后的文件名格式:temp.log.2023-08-10_10-05-47 match = re.search(r'\.(\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2})$', default_name) if match: time_str = match.group(1) # 将时间格式从YYYY-MM-DD_HH-MM-SS转为YYYYMMDD-HHMMSS formatted_time = time_str.replace('-', '').replace('_', '-') # 生成期望的文件名格式 return os.path.join(log_dir, f'{formatted_time}_.log') return default_name handler.namer = custom_namer logger.addHandler(handler) i = 0 while True: logger.info(i) print(i) time.sleep(1) i += 1
关键说明
- 初始文件名简化:用
temp.log作为临时基础名,滚动后会被namer函数重命名为对应时间的目标文件,无需提前拼接时间。 - custom_namer函数:通过正则匹配默认生成的带时间后缀的文件名,提取时间部分并转换格式,最终生成你需要的
YYYYMMDD-HHMMSS_.log格式。 - backupCount=0:保持你原有的设置,此时处理器会在滚动时直接重命名文件,不会保留额外备份。
运行后生成的日志文件将完全符合预期:
20230810-100547_.log 20230810-100548_.log 20230810-100549_.log
内容的提问来源于stack exchange,提问作者user17135505
相关产品推荐
相关产品推荐

