乐于分享
好东西不私藏

我给 AI 助手装了一套"行车记录仪"

我给 AI 助手装了一套"行车记录仪"

用 200 行 Python,补足 OpenClaw 记忆体系中最缺的那块

OpenClaw 的记忆系统,其实有个明显的短板

OpenClaw 本身有一套记忆机制:MEMORY.md 存长期记忆,memory/YYYY-MM-DD.md 存每日笔记,~/self-improving/ 存经验教训。看起来很完整。

但实际用起来有个很要命的问题:这些记忆都是"结论",没有"过程"。

举个例子。今天天气任务执行了,OpenClaw 可能在 daily note 里记一笔"天气播报完成"。但:

  • 脚本运行了几秒?调用了哪些工具?
  • 投递了什么内容给用户?
  • 成功还是失败?失败了是什么原因?

没有记录。全凭 AI 自己"记"。

问题在于,AI 的记忆本质上是上下文窗口 + 文件读写。它不是数据库,没有结构化的查询能力。每次新会话启动,它只能从 MEMORY.md 和 daily note 里"回忆"之前发生了什么——而这些文件里记的,往往是它自己觉得重要的"结论",而不是完整的执行过程。

OpenClaw 缺的不是记忆本身,而是记录执行的标准化流程。

没有标准,就会出现:

  • 这个任务记了,那个任务没记
  • 记了结果,没记过程
  • 记了今天,忘了昨天
  • 出了 bug 没法回溯排查

我需要一套执行日志系统,补足这块短板。

设计思路:够用就行,别过度设计

动手之前我先想清楚了几件事:

不要数据库。 SQLite 也好,MySQL 也好,都太重了。一天几百条记录,文件系统完全够用。

不要复杂框架。 不需要 Log4j 那种分级别、分 Handler 的框架。就一个 Python 脚本,三个功能:写入、读取、摘要。

格式要机器可读。 每行一个 JSON 对象(JSON Lines),方便用 grepjq、Python 脚本处理。

核心就三个问题:

  1. 记什么
     — 时间、类型、指令、结果、内容摘要
  2. 怎么存
     — 按日期分目录,按类型分文件,追加模式写入
  3. 怎么用
     — 能写入、能按日期读取、能生成每日摘要

实现:200 行的 log-exec.py

写入日志

每次任务执行完后,调用一行命令:

python3 ~/.openclaw/workspace/scripts/log-exec.py \  weather '广州天气通勤提醒 07:15' 'success' \  --content '广州今日多云转晴,25-31°C,早上兴业app坐地铁'

脚本自动完成:

  1. 根据当前日期创建目录 exec-log/2026-05-17/
  2. 把日志追加写入 weather.log(文件不存在自动创建)
  3. 输出确认信息 [LOG] 已记录到 ...

日志格式

每条日志是一个 JSON 对象,包含 5 个字段:

{  "time": "2026-05-17 07:15:00",  "type": "weather",  "instruction": "广州天气通勤提醒 07:15",  "result": "success",  "content_preview": "广州今日多云转晴,25-31°C"}
字段
说明
time
执行时间,精确到秒,自动生成
type
任务类型,自由命名,500字以内
instruction
任务指令/描述,500字以内
result
执行结果:success/failed/partial,200字以内
content_preview
投递内容摘要,300字以内

用 JSON Lines 格式(每行一个 JSON 对象)。追加写入不需要解析整个文件,用 grep/jq 过滤也很方便。

文件结构

exec-log/├── 2026-05-12/│   ├── weather.log          ← 天气任务│   ├── fund.log             ← 基金行情│   ├── monitor.log          ← 价格监控(每30分钟一次,一天48条)│   ├── user_request.log     ← 用户的每次对话│   ├── maintenance.log      ← 系统维护操作│   ├── backup.log           ← 系统备份│   └── ...├── 2026-05-13/└── ...

按日期分目录,同类型任务追加到同一个文件。type 命名规则很简单:定时任务用功能英文关键词(weatherfundmonitor),用户请求统一 user_request,系统维护统一 maintenance。没有固定分类表,拿来就用。

读取和摘要

# 查看今天的摘要python3 scripts/log-exec.py --summary 2026-05-17# 输出:# 📊 执行日志摘要 (2026-05-17)# 共 30 条记录,8 种类型#   channel_zzz: 1次 (✅1/❌0)#   fund: 1次 (✅1/❌0)#   maintenance: 1次 (✅1/❌0)#   monitor: 23次 (✅23/❌0)#   morning_brief: 1次 (✅1/❌0)#   news: 1次 (✅1/❌0)#   user_request: 1次 (✅1/❌0)#   weather: 1次 (✅1/❌0)
# 读取指定日期指定类型的日志python3 scripts/log-exec.py --read 2026-05-17 --type monitor

摘要功能统计每个类型的执行次数、成功数和失败数。哪个任务跑了几次、有没有失败,一眼就能看出来。

脚本核心逻辑

脚本不到 200 行,三个功能:

写入时: 获取当前日期 → 创建目录 → sanitize 文件名 → 构建 JSON → 追加写入 → 打印确认。

读取时: 遍历目录下所有 .log 文件 → 按类型过滤 → 逐行解析 JSON → 返回列表。

摘要时: 读取当天所有日志 → 按 type 分组 → 统计成功/失败数 → 格式化输出。

没有异常处理的花哨写法,没有日志轮转,没有异步写入。简单直接,够用就行。

强制触发:不记日志就不让回复

光有脚本不够,得让 OpenClaw 每次都必须记日志

我在 AGENTS.md 里加了一条铁律:

🔴 回复前置检查清单(硬性执行,不可跳过)

Step 1: 先调日志脚本

python3 ~/.openclaw/workspace/scripts/log-exec.py <type> '<指令描述>' '<result>' --content '<摘要>'

Step 2: 确认 [LOG] 已记录到Step 3: 再输出回复给用户

⛔ Step 1 没完成,不允许跳到 Step 3。

顺序是:先记日志 → 确认写入 → 再回复。不记日志,不允许回复。

补充规则:如果回复已经发出但还没记日志,立刻补记,不要等主人提醒。

这就是"执行标准"的具体落地——不是靠 AI 自觉记住要记日志,而是靠流程强制保证每一次都记。

效果:从"凭感觉回忆"变成"按记录查账"

日志系统上线第一天(2026-05-12),记录了 88 条执行记录,11 种任务类型。

类型
次数
说明
user_request
41次
用户的每次对话
monitor
25次
手机价格监控,每30分钟一次
maintenance
13次
系统维护操作
fund
1次
基金行情提醒
channel_xxx
3次
游戏频道精选
offwork
1次
下班提醒
backup
1次
系统自动备份
heartbeat
1次
心跳轮询
weather
1次
天气通勤提醒
news
1次
每日新闻简报
oppo-monitor
1次
手动触发的价格监控

后续几天稳定运行。5 月 16日:67条记录,10种类型,全部成功。

有了日志系统之后,OpenClaw 的记忆体系才真正完整了:

  • MEMORY.md
     → 存"我知道什么"(长期知识)
  • daily note
     → 存"今天发生了什么"(事件流水)
  • self-improving/
     → 存"我学到了什么"(经验教训)
  • exec-log/
     → 存"每次任务具体怎么执行的"(执行记录)

之前缺的,就是最后这块。

进阶用法:让 AI 每天自动复盘

日志系统搭好之后,我用它做了一个更有意思的东西——每日自动复盘

每天凌晨 3:30,OpenClaw 会自动触发一个复盘 cron 任务:

  1. 用 log-exec.py --summary 读取前一天的执行摘要
  2. 逐类分析每个任务的 result 字段,统计成功率和失败率
  3. 对比前几天的数据,看趋势是变好还是变差
  4. 分析哪些任务出了问题、可能的原因是什么
  5. 总结当天新增了哪些功能、踩了哪些坑
  6. 把复盘结论写入 daily note 和 MEMORY.md
  7. 生成语音播报,早上起床就能听

复盘任务本身完全依赖日志系统获取数据。没有日志,复盘就是"凭印象总结";有了日志,复盘才是"用数据说话"。

日志系统不只是"查账"的工具,它让 AI 真正具备了"自我反思"的能力。

踩过的坑

1. 类型命名别搞太复杂

一开始搞了个分类表:cron-weathercron-funduser-chatsystem-maintenance……每次新增任务都要查表,还经常纠结"这个该归哪类"。

后来改成自由命名:定时任务就用功能英文关键词,一个词,不要空格和符号。weatherfundmonitorbackup。不用注册,拿来就用。

2. 别用数据库

想过用 SQLite,但一天最多几百条记录,JSON Lines + grep + Python 脚本完全够用。零依赖,cat exec-log/2026-05-17/monitor.log 就能看。

3. 强制要写在"回复前"

先写"回复后",结果经常忘。改成"回复前"并定义为硬性要求后,记录率从 ~70% 提升到接近 100%。

4. 日志字段不要太贪心

第一版有七八个字段:time、type、instruction、result、content_preview、tool_calls_count、duration_ms、model_name……很多根本用不上。最后精简到 5 个。够用。

写在最后

OpenClaw 的记忆功能设计得已经很不错了,但"记忆"和"执行记录"是两回事。记忆告诉你"我知道什么",执行记录告诉你"我具体干了什么、怎么干的、结果如何"。

日志系统补的就是这个缺口。200 行 Python,一个多小时搞定,但它让 AI Agent 的行为从"黑盒"变成了"白盒"。

如果你也在用 OpenClaw 跑定时任务,强烈建议加一套执行日志。不用多复杂,能记录、能查询、能审计,就够了。

代码不长,思路简单,但带来的掌控感是完全不一样的。