From eb869c7ad211b1047e0f3a67e52cbc6e527b1073 Mon Sep 17 00:00:00 2001 From: shy3130 <415333856@qq.com> Date: Fri, 14 Aug 2026 13:40:57 +0800 Subject: [PATCH] =?UTF-8?q?fix(logging):=20=E5=BC=80=E5=8F=91=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E8=BF=BD=E5=8A=A0=E6=96=87=E4=BB=B6=E6=97=A5=E5=BF=97?= =?UTF-8?q?=20backend.log?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit dev 模式 (uvicorn) logging.basicConfig 只有 StreamHandler, 同步/管道等 运行时日志 (daily_pipeline 的 logger.info 等) 仅出现在 dev 终端, 关掉或滚屏 后即丢失, 排查「同步后日志没落」时无处可查。 追加 RotatingFileHandler 落盘到 data/backend.log, 与桌面版 (desktop.py:_setup_logging → desktop.log) 行为对齐。frozen (桌面版) 已由 desktop.py 负责, 此处跳过避免重复落盘。RotatingFileHandler (10MB×3) 防止 长期运行/频繁 reload 导致文件无限增长。 注: 同步进度日志 (job_store JSON, 经 /api/pipeline/jobs 返回) 一直正常落盘, 本次只补应用级日志的文件落盘。 --- backend/app/main.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/backend/app/main.py b/backend/app/main.py index 902022f..09ea0f2 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -2,6 +2,7 @@ from __future__ import annotations import logging +import sys import threading from contextlib import asynccontextmanager from pathlib import Path @@ -32,6 +33,28 @@ logging.basicConfig( ) logger = logging.getLogger(__name__) +# 追加文件日志: uvicorn (含 --reload 开发模式) 默认只有 StreamHandler, 同步/管道等 +# 运行时日志仅出现在 dev 终端, 关掉或滚屏后即丢失, 排查「同步后日志没落」时无处可查。 +# 落盘到 data/backend.log 与桌面版 (desktop.py:_setup_logging → desktop.log) 行为对齐, +# 事后可查。桌面版 (frozen) 已由 desktop.py 写 desktop.log, 此处跳过避免重复落盘。 +# RotatingFileHandler 防止长期运行/频繁 reload 导致文件无限增长。 +if not getattr(sys, "frozen", False): + try: + from logging.handlers import RotatingFileHandler + + _log_path = settings.data_dir / "backend.log" + _log_path.parent.mkdir(parents=True, exist_ok=True) + _file_handler = RotatingFileHandler( + _log_path, maxBytes=10 * 1024 * 1024, backupCount=3, + mode="a", encoding="utf-8", errors="replace", + ) + _file_handler.setFormatter( + logging.Formatter("%(asctime)s [%(levelname)s] %(name)s: %(message)s") + ) + logging.getLogger().addHandler(_file_handler) + except Exception as _e: # noqa: BLE001 + logger.warning("文件日志初始化失败, 仅输出到终端: %s", _e) + @asynccontextmanager async def lifespan(app: FastAPI):