logging.handler.TimedRotatingFileHandler在服务器上工作异常求助
Faust应用中TimedRotatingFileHandler日志分割异常问题排查与解决
问题根源分析
核心问题是TimedRotatingFileHandler的时区配置、初始化逻辑与服务器本地环境不匹配,导致日志分割时间、文件名、内容时间三者错位。
具体解决方案
1. 修正时区与分割时间配置
TimedRotatingFileHandler默认使用UTC时区,若服务器采用本地时区(如东八区),会导致日志分割时间比本地日期滞后,直接引发内容与文件名日期不符的问题:
- 配置Handler时添加
utc=False参数,强制使用服务器本地时区 - 指定
atTime=datetime.time(0,0,0),确保每天凌晨0点准时触发日志分割
2. 统一Logger初始化逻辑,避免重复配置
每个文件独立配置Logger容易引发Handler重复添加、Logger层级冲突,建议封装全局初始化函数:
import logging from logging.handlers import TimedRotatingFileHandler import os from datetime import time def get_file_logger(logger_name, log_folder): # 创建专属日志文件夹 os.makedirs(log_folder, exist_ok=True) log_path = os.path.join(log_folder, f"{logger_name}.log") # 获取或复用Logger实例 logger = logging.getLogger(logger_name) logger.setLevel(logging.INFO) # 避免重复添加Handler(关键) if logger.handlers: return logger # 配置按天分割的文件Handler file_handler = TimedRotatingFileHandler( log_path, when="D", interval=1, backupCount=30, utc=False, # 使用本地时区 atTime=time(0, 0, 0), # 凌晨0点分割 encoding="utf-8" ) # 配置带精确时间的日志格式 log_formatter = logging.Formatter( "%(asctime)s - %(name)s - %(levelname)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S" ) file_handler.setFormatter(log_formatter) logger.addHandler(file_handler) return logger
业务文件中直接调用:
# rule_checking.py logger = get_file_logger("rule_checking", "./logs/rule_checking") # tracking_checking.py logger = get_file_logger("tracking_checking", "./logs/tracking_checking")
3. 验证服务器时区与系统时间
登录服务器执行以下命令,确认时区和时间是否正确:
# 查看当前时区与时间状态 timedatectl # 查看当前系统时间 date
若时区错误,可执行命令修改(以上海时区为例):
sudo timedatectl set-timezone Asia/Shanghai
4. 重启Faust进程
若进程长时间运行,Handler内部的时间计算可能出现偏差,重启服务让新的Logger配置生效。
额外注意事项
- 确保Logger配置在Faust app启动前完成,避免在异步函数内初始化
- 检查日志文件夹的读写权限,保证Faust进程有写入权限
内容的提问来源于stack exchange,提问作者Aylin Naebzadeh
相关产品推荐
相关产品推荐

