
Loguru 使用 {time} 占位符会导致每次启动都生成新日志文件,破坏时间轮转逻辑;正确做法是移除 {time},让 Loguru 基于文件修改时间自动判断轮转时机。
loguru 使用 `{time}` 占位符会导致每次启动都生成新日志文件,破坏时间轮转逻辑;正确做法是移除 `{time}`,让 loguru 基于文件修改时间自动判断轮转时机。
在 Django 等常重启的开发环境中,若为 Loguru 日志处理器(handler)的 sink 路径中嵌入 {time} 占位符(如 "/logs/django_loguru_{time}.log"),Loguru 将无法复用已有日志文件——每次应用启动时都会解析当前时间并生成一个全新命名的文件,即使该文件为空、且距离上一次轮转远未达到设定周期(如 "1 week")。这导致日志目录迅速堆积大量零字节文件,完全违背了 rotation 和 retention 的设计意图。
根本原因在于:Loguru 的时间轮转机制依赖对单个目标文件的元数据(尤其是最后修改时间)进行持续追踪。当 sink 包含 {time} 时,Loguru 实际上放弃了“固定文件路径”这一前提,转而将每个新文件视为独立个体,既不检查历史同名文件,也无法基于 mtime 推算下次轮转时间——这与标准 logging.handlers.TimedRotatingFileHandler 的行为形成鲜明对比(后者始终操作同一文件路径,并据此计算轮转点)。
✅ 正确配置方式如下(关键:sink 必须为静态路径):
from loguru import logger
logger.configure(
handlers=[
{
"sink": "/logs/django_loguru.log", # ✅ 移除 {time},使用固定路径
"rotation": "1 week", # 按周轮转(基于文件 mtime)
"retention": "1 month", # 保留最近一个月的日志文件
"compression": "zip", # 可选:轮转后自动压缩旧日志
"level": "INFO",
"format": "{time:YYYY-MM-DD HH:mm:ss} | {level} | {name}:{function}:{line} - {message}",
}
]
)
? 注意事项:
- Loguru 会在首次写入时自动创建
/logs/django_loguru.log,后续所有启动均复用该文件; - 第一次达到
"1 week"时(即文件最后修改时间距今 ≥ 7 天),Loguru 将重命名该文件为django_loguru.2025-04-13_00-00-00_000000.log(含时间戳),并新建空的django_loguru.log继续写入; -
retention="1 month"会定期清理早于 30 天的轮转归档文件(需确保进程有足够权限); - 若需区分环境,可通过变量拼接路径(如
f"/logs/{ENV}_loguru.log"),但禁止在文件名中动态插入{time}; - 生产部署前,请验证
/logs/目录具有写入权限,且磁盘空间充足。
总结:Loguru 的 rotation 参数本质是“基于单一文件的生命周期管理”,而非“按时间模板生成文件”。坚持使用静态 sink 路径,是启用可靠时间轮转的前提。










