--- name: frontend_debug_log_to_file description: 当需要把前端日志输出到后端文件(如调试目标模式、轮询状态等)时,应该索引本记忆 --- # 前端日志输出到文件 ## 背景 项目已内置一套轻量级的前端 → 后端日志上报机制,用于把浏览器端的状态变化/调试信息持久化到服务器日志文件,便于复现和排查问题。 ## 基础设施 ### 后端端点 - 文件:`server/app_legacy.py` - 端点:`POST /api/client_debug_log` - 写入函数:`log_goal_mode_debug_entry(data: Dict[str, Any])` - 日志文件:`{LOGS_DIR}/goal_mode_debug.log` - 宿主机模式示例:`/Users/jojo/.astrion/astrion/host/logs/goal_mode_debug.log` ### 前端函数 - 文件:`static/src/app/methods/common.ts` - 函数:`goalModeDebugLog(event: string, payload: Record = {})` - 默认关闭,避免日常刷屏 ## 启用方式 ### 方式一:浏览器控制台临时开启(无需改代码) ```js localStorage.setItem('goalModeDebug', '1') // 刷新页面后生效 ``` ### 方式二:代码里强制开启 在 `common.ts` 中修改 `isGoalModeDebugEnabled()`,让它默认返回 `true`: ```ts function isGoalModeDebugEnabled() { // ... return true; // 强制开启 } ``` ### 方式三:运行时开关 ```js window.__GOAL_MODE_DEBUG__ = true ``` ## 使用方式 在前端需要记录状态的位置调用: ```ts import { goalModeDebugLog } from './common'; goalModeDebugLog('event_name', { conversationId: this.currentConversationId, someState: this.someState, // 其他需要记录的字段 }); ``` 调用后会: 1. 在浏览器控制台输出 `[GOAL_MODE_DEBUG]` 前缀日志 2. 通过 `fetch('/api/client_debug_log', ...)` 上报到后端 3. 后端写入 `goal_mode_debug.log` ## 注意事项 - 日志默认关闭,只有显式开启后才会输出 - `fetch` 调用使用 `void` 前缀,不会阻塞业务流程 - 上报失败会被静默捕获,不影响主流程 - 如需长期保留某类日志,应把调用代码保留在目标文件中;临时调试后建议清理调用点,只保留 `common.ts` 和后端端点基础设施 ## 历史应用 - 曾用于排查"第一个对话开启目标模式后停止,目标状态被错误继承到下一个对话"的问题 - 修复代码位于 `server/tasks/api.py`: - `/api/tasks//cancel` 取消任务时同步停止工作区目标状态 - `POST /api/tasks` 创建非目标模式任务时清理残留的活动目标状态