1 引言
本系列主要记录openclaw部署过程中的一些问题,本期问题讨论gateway的滚动log。配置说明:windows11+openclaw(版本2026.3.28+版本2026.4.11)
2 日志迁移问题
openclaw有两个主要日志:
• 会话(session)日志:记录UI界面与小龙虾的对话,主要存放路径是 .\.openclaw\agents\main\sessions;• 网关(gateway)日志:记录每天网关运行的动态信息,存放路径文件是 C:\Users\你的用户名\.openclaw\logs\openclaw-YYYY-MM-DD.log。在openclaw更新以后,存放路径文件改在C:\Temp\openclaw\openclaw-YYYY-MM-DD.log
会话日志的路径设置很简单,在配置文件openclaw.json中修改workspace路径,加上设置环境变量OPENCLAW_HOME即可。
• 管理员方式打开powershell设置环境变量
[Environment]::SetEnvironmentVariable("OPENCLAW_HOME", "D:\openclaw\config", "Machine")• 修改workspace路径
openclaw config set agents.defaults.workspace "D:\openclaw\config\.openclaw\workspace"网关日志的路径设置按照官方,是通过设置logging.file来实现,但是此代码修改无效,这是一个官方bug。
这是因为logging.file配置根据没有被读取。
源码文件的函数resolveSettings() → 调用readLoggingConfig() 读取配置文件,没有调用logging.file的配置。
原本版本2026.3.28以前就存在这个问题,但是直到版本2026.4.11,这个问题还未修复。
所以这个bug还要继续等官方补丁或者自行修改。
3 网关日志迁移
管理网关日志的源码文件是logger-CnaMaZPi.js。
这个文件存放在npm拉取的openclaw当中,一般存放路径为.\npm\node_modules\openclaw\dist。
建议修改方式如下:
1. 创建目标储存路径,例如 ./openclaw/temp/gateway_log2. 在.env文件中引入环境变量
# .env 文件内容GATEWAY_LOG_PATH="./openclaw/temp/gateway_log"3. 参照官方文档,修改配置 logging.file
openclaw config set logging.file "./openclaw/temp/gateway_log/openclaw-YYYY-MM-DD.log"4. 修改源码1:添加日期占位符替换函数在 formatLocalDate() 函数之后,defaultRollingPathForToday() 函数之前(约第566-573行),新增代码:
functionreplaceDatePlaceholders(filePath) {if (filePath.includes("YYYY-MM-DD")) {const today = formatLocalDate(/* @__PURE__ */newDate());return filePath.replaceAll("YYYY-MM-DD", today); }return filePath;}功能:
• 检查文件路径是否包含 "YYYY-MM-DD" 占位符 • 使用当前日期替换所有占位符 • 保持路径完整性,兼容 Windows 和 POSIX 路径格式
5. 修改源码1:修改函数 resolveSettings()在函数定义function resolveSettings()内部增加代码,完整表述如下
functionresolveSettings() {if (!canUseNodeFs()) return {level: "silent",file: DEFAULT_LOG_FILE,maxFileBytes: DEFAULT_MAX_LOG_FILE_BYTES };const envLevel = resolveEnvLogLevelOverride();if (canUseSilentVitestFileLogFastPath(envLevel)) return {level: "silent",file: defaultRollingPathForToday(),maxFileBytes: DEFAULT_MAX_LOG_FILE_BYTES };let cfg = loggingState.overrideSettings ?? readLoggingConfig();if (!cfg && !shouldSkipMutatingLoggingConfigRead()) try { cfg = (requireConfig?.("../config/config.js"))?.loadConfig?.().logging; } catch { cfg = void0; }const defaultLevel = process.env.VITEST === "true" && process.env.OPENCLAW_TEST_FILE_LOG !== "1" ? "silent" : "info";const fromConfig = normalizeLogLevel(cfg?.level, defaultLevel);// 新增部分const gatewayLogPath = process.env.GATEWAY_LOG_PATH?.trim();let file;if (gatewayLogPath) {const today = formatLocalDate(/* @__PURE__ */newDate()); file = path.join(gatewayLogPath, `${LOG_PREFIX}-${today}${LOG_SUFFIX}`); } else { file = cfg?.file ?? defaultRollingPathForToday(); }return {level: envLevel ?? fromConfig,file: replaceDatePlaceholders(file),maxFileBytes: resolveMaxLogFileBytes(cfg?.maxFileBytes) };}功能:函数resolveSettings()能够调用GATEWAY_LOG_PATH 环境变量
源码修改后,优先级顺序如下:
• GATEWAY_LOG_PATH 环境变量:设置为日志目录,自动生成 openclaw-YYYY-MM-DD.log 文件 • 配置文件中的 logging.file 设置:完整的日志文件路径 • 默认日志路径:%TEMP%\openclaw\openclaw-YYYY-MM-DD.log
当然,步骤4与步骤5也可以通过调动小龙虾来自行修改,提示词的逻辑如下:
我打算修改gateway日志的logging.file的储存逻辑。补充信息如下:- 官方文档“https://docs.openclaw.ai/logging”提供了logging.file的储存配置修改- 但是此修改无效,可参考"https://github.com/openclaw/openclaw/issues/61295"- 源码文件是logger-CnaMaZPi.js需求如下:- 创建源码文件的备份文件backup- 在.env添加环境变量GATEWAY_LOG_PATH="你的路径选择/openclaw/temp/gateway_log"- 修改logger-CnaMaZPi.js源码,能够读取GATEWAY_LOG_PATH- gateway日志以openclaw-YYYY-MM-DD.log方式储存,这里YYYY-MM-DD以实际日期替换,例如你可以用formatLocalDate()函数生成-告诉我你在源码的基础上,修改了哪些地方-修改完成即可,禁止执行任何[重启/启动/暂停]openclaw网关命令,我会自己重启查看修改效果此次修改比较简单,国内外模型都能很好处理。
夜雨聆风