乐于分享
好东西不私藏

OpenClaw问题记录1:网关日志迁移

OpenClaw问题记录1:网关日志迁移

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. 1. 创建目标储存路径,例如./openclaw/temp/gateway_log
  2. 2. 在.env文件中引入环境变量
# .env 文件内容GATEWAY_LOG_PATH="./openclaw/temp/gateway_log"
  1. 3. 参照官方文档,修改配置logging.file
openclaw config set logging.file "./openclaw/temp/gateway_log/openclaw-YYYY-MM-DD.log"
  1. 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 路径格式
  1. 5. 修改源码1:修改函数resolveSettings()在函数定义function resolveSettings()内部增加代码,完整表述如下
functionresolveSettings() {if (!canUseNodeFs()) return {level"silent",fileDEFAULT_LOG_FILE,maxFileBytesDEFAULT_MAX_LOG_FILE_BYTES    };const envLevel = resolveEnvLogLevelOverride();if (canUseSilentVitestFileLogFastPath(envLevel)) return {level"silent",filedefaultRollingPathForToday(),maxFileBytesDEFAULT_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,filereplaceDatePlaceholders(file),maxFileBytesresolveMaxLogFileBytes(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网关命令,我会自己重启查看修改效果

此次修改比较简单,国内外模型都能很好处理。