摘要

本文详细介绍 OpenClaw 的每日日志系统 memory/YYYY-MM-DD.md。从日志文件结构、写入时机、内容规范到自动化管理,全面解析如何通过每日日志实现 AI Agent 的短期记忆能力。通过实际案例演示日志的创建、更新、查询流程,帮助开发者构建具有时间连续性的智能应用,实现任务跟踪和上下文恢复。📅


1. 引言 - 为什么需要每日日志?

1.1 每日日志的作用

作用 说明 示例
任务跟踪 记录当天完成的任务 完成第41篇文章
上下文恢复 帮助 AI 恢复之前的工作状态 昨天写到哪了?
问题记录 记录遇到的问题和解决方案 编译错误已修复
决策追溯 记录临时决策的原因 为什么选择这个方案
进度监控 追踪长期任务的进展 项目完成度 40%

1.2 每日日志 vs 长期记忆

生命周期

记忆层次

提取重要信息

归档

定期清理

当天

7天内

超过7天

长期记忆
MEMORY.md

每日日志
YYYY-MM-DD.md

历史日志

删除

活跃使用

可检索

归档/删除

1.3 日志系统架构

memory/
├── 2026-04-13.md    # 今天的日志
├── 2026-04-12.md    # 昨天的日志
├── 2026-04-11.md    # 前天的日志
├── ...
└── 2026-03-01.md    # 更早的日志

2. 日志文件结构

2.1 标准日志模板

# 2026-04-13 工作记录

## 完成的任务

### 1. [任务名称]
- 具体内容
- 完成状态
- 相关链接

### 2. [任务名称]
- 具体内容
- 完成状态

## 进行中的任务
- 任务A:进度 60%
- 任务B:进度 30%

## 重要决策
- 决策内容
- 决策原因

## 遇到的问题
- 问题描述
- 解决方案

## 明日计划
- [ ] 待办事项1
- [ ] 待办事项2

## 备注
- 其他需要记录的信息

2.2 日志内容分类

分类 内容 示例
完成的任务 当天完成的工作 写完第41篇文章
进行中的任务 未完成的任务进度 文章写到一半
重要决策 临时决策及原因 选择方案A而非B
遇到的问题 问题和解决方案 编译错误已修复
明日计划 下一步工作安排 继续写第42篇
备注 其他信息 用户心情不错

2.3 日志写入时机

任务完成

问题遇到

决策做出

会话结束

用户要求

事件发生

事件类型

写入完成任务

写入问题和解决方案

写入决策

写入会话摘要

写入指定内容

更新日志文件


3. 日志写入规范

3.1 写入原则

原则 说明 正确示例 错误示例
及时性 事件发生后立即记录 任务完成后马上写 第二天才记录
准确性 信息准确无误 “完成第41篇文章” “写了篇文章”
简洁性 提取关键信息 “修复编译错误:缺少依赖” “遇到了一个编译错误,找了半天…”
可追溯 包含必要上下文 “选择方案A(性能更好)” “选择方案A”

3.2 任务状态标记

## 任务状态标记规范

✅ 已完成
🔄 进行中
⏳ 待开始
❌ 已取消
⚠️ 有问题

3.3 时间戳使用

## 带时间戳的日志

### 2026-04-13 09:00
- 开始撰写第41篇文章

### 2026-04-13 11:30
- 完成文章摘要和引言

### 2026-04-13 14:00
- 用户反馈:需要调整结构
- 已按要求修改

4. 日志读取与查询

4.1 读取当天日志

# AI 内部操作
read("memory/2026-04-13.md")

4.2 读取历史日志

# 读取昨天的日志
read("memory/2026-04-12.md")

# 读取最近7天的日志
for i in range(7):
    date = today - timedelta(days=i)
    read(f"memory/{date.strftime('%Y-%m-%d')}.md")

4.3 语义搜索日志

# 搜索特定内容
memory_search(
    query="用户反馈",
    maxResults=5
)

4.4 日志查询场景

场景 查询方式
今天做了什么 读取当天日志
昨天写到哪了 读取昨天日志
最近的任务进度 读取最近7天日志
某个问题的解决方案 语义搜索
某个决策的原因 语义搜索

5. 日志维护策略

5.1 自动归档流程

每日检查

日志超过7天?

保留

有重要内容?

提取到MEMORY.md

归档到archive/

超过30天?

删除

保留归档

5.2 归档目录结构

memory/
├── 2026-04-13.md        # 最近7天
├── 2026-04-12.md
├── ...
├── archive/              # 归档目录
│   ├── 2026-03/
│   │   ├── 2026-03-01.md
│   │   ├── 2026-03-02.md
│   │   └── ...
│   └── 2026-02/
│       └── ...

5.3 日志清理规则

规则 时间 操作
活跃期 0-7天 保留原位置
归档期 7-30天 移动到archive/
清理期 超过30天 删除(重要内容已提取)

6. 实战案例

6.1 案例一:任务跟踪

场景:用户正在撰写系列文章,需要跟踪进度

日志记录

# 2026-04-13 工作记录

## 完成的任务

### 1. 撰写第41篇文章:记忆系统
- ✅ 完成摘要和引言
- ✅ 完成 MEMORY.md 章节
- ✅ 完成语义搜索章节
- ✅ 完成实战案例
- 📝 文章下载链接:https://...

## 进行中的任务
- 第42篇文章:日志记忆系统
  - 进度:0%
  - 预计明天开始

## 项目进度
- 总目标:100篇文章
- 已完成:41篇
- 完成率:41%

第二天恢复

用户:昨天写到哪了?

AI:(读取 memory/2026-04-12.md)
昨天你完成了第41篇文章(记忆系统),
当前项目进度是41/100,完成率41%。
今天应该继续写第42篇:日志记忆系统。

6.2 案例二:问题追踪

场景:用户遇到问题,需要记录解决方案

日志记录

# 2026-04-13 工作记录

## 遇到的问题

### 问题:Gateway 启动失败
- **现象**:`openclaw gateway start` 报错
- **原因**:端口 18800 被占用
- **解决方案**:
  1. 检查端口占用:`lsof -i :18800`
  2. 终止占用进程:`kill -9 <PID>`
  3. 重新启动:`openclaw gateway start`
- **状态**:✅ 已解决

## 参考资料
- Gateway 文档:https://docs.openclaw.ai/gateway

后续查询

用户:之前 Gateway 启动失败是怎么解决的?

AI:(搜索 memory/)
根据 2026-04-13 的日志,问题是端口 18800 被占用。
解决方案是:
1. 检查端口占用:lsof -i :18800
2. 终止占用进程:kill -9 <PID>
3. 重新启动:openclaw gateway start

6.3 案例三:决策追溯

场景:用户需要回顾之前的决策

日志记录

# 2026-04-10 工作记录

## 重要决策

### 决策:文章采用 5 阶段结构
- **背景**:需要规划 100 篇技术文章
- **选项**:
  - A:按主题分类(10个主题各10篇)
  - B:按难度递进(5个阶段各20篇)
  - C:按功能模块(20个模块各5篇)
- **选择**:方案 B
- **原因**:
  1. 由浅入深更符合学习曲线
  2. 读者可以按阶段学习
  3. 便于后续扩展
- **时间**:2026-04-10 14:30

后续追溯

用户:我们为什么选择 5 阶段结构?

AI:(搜索 memory/)
根据 2026-04-10 的决策记录,选择 5 阶段结构的原因是:
1. 由浅入深更符合学习曲线
2. 读者可以按阶段学习
3. 便于后续扩展
当时考虑了 3 个方案,最终选择了方案 B。

7. 日志与其他系统的协作

7.1 日志 + MEMORY.md

提取规则

提取重要信息

提供长期记忆

每日日志

MEMORY.md

用户偏好

重要决策

项目上下文

7.2 日志 + 语义搜索

# 搜索日志中的特定内容
results = memory_search(
    query="Gateway 启动失败",
    maxResults=3
)

# 结果可能来自多个日志文件
# memory/2026-04-13.md
# memory/2026-04-10.md
# memory/2026-04-05.md

7.3 日志 + Heartbeat

# HEARTBEAT.md

# 心跳检查时更新日志

## 检查项
- [ ] 更新今日日志
- [ ] 检查是否有遗漏的任务
- [ ] 记录当前进度

8. 自动化日志管理

8.1 自动创建日志

# 每日自动创建日志文件
import datetime

def create_daily_log():
    today = datetime.date.today()
    log_path = f"memory/{today.strftime('%Y-%m-%d')}.md"
    
    template = f"""# {today.strftime('%Y-%m-%d')} 工作记录

## 完成的任务
(待记录)

## 进行中的任务
(待记录)

## 明日计划
(待记录)
"""
    
    write(log_path, template)

8.2 自动归档脚本

#!/bin/bash
# archive_old_logs.sh

# 将超过7天的日志移动到归档目录
find memory/ -name "*.md" -mtime +7 -exec mv {} memory/archive/ \;

# 删除超过30天的归档
find memory/archive/ -name "*.md" -mtime +30 -delete

8.3 日志摘要生成

# 从日志中提取摘要
def generate_summary(log_content):
    """从日志内容中提取关键信息"""
    summary = {
        "completed_tasks": extract_tasks(log_content, "完成的任务"),
        "in_progress": extract_tasks(log_content, "进行中的任务"),
        "decisions": extract_decisions(log_content),
        "problems": extract_problems(log_content)
    }
    return summary

9. 常见问题与解决

Q1:日志文件太多怎么办?

解决方案

  1. 启用自动归档
  2. 定期清理旧日志
  3. 只保留重要内容的摘要

Q2:如何避免日志内容重复?

解决方案

  1. 使用时间戳区分
  2. 同类任务合并记录
  3. 定期整理和去重

Q3:日志内容太长怎么办?

解决方案

  1. 只记录关键信息
  2. 使用链接引用详细内容
  3. 定期提取摘要到 MEMORY.md

Q4:如何保护日志中的敏感信息?

解决方案

  1. 不记录敏感个人信息
  2. 使用占位符替代敏感数据
  3. 限制日志文件访问权限

10. 总结

10.1 核心要点

要点 说明
及时记录 事件发生后立即写入日志
结构清晰 使用标准模板组织内容
定期维护 归档旧日志,提取重要信息
语义检索 使用 memory_search 快速定位

10.2 最佳实践清单

  • 每天创建新的日志文件
  • 及时记录完成的任务
  • 记录问题和解决方案
  • 记录重要决策及原因
  • 定期归档旧日志
  • 提取重要信息到 MEMORY.md

10.3 下一步

  • 第43篇:OpenClaw memory_search:语义搜索实战
  • 第44篇:OpenClaw 记忆维护:自动整理与归档
  • 第45篇:OpenClaw 上下文管理:Token 优化策略

参考资料

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐