Claude Code 日志文件越来越大:自动定时清理的配置方法

每天重度使用 Claude Code,日志文件会悄悄增长到 22MB 甚至更多。手动清理容易遗忘,本文用 macOS launchd 和 Linux cron 两种方案实现夜间自动截断,保留最近 5000 行同时清零旧内容。

Claude Code 日志文件越来越大:自动定时清理的配置方法

重度使用 Claude Code 几周后,日志文件会悄悄积累到 22MB——大多数人是磁盘空间告急时才发现。日志膨胀的原因:Claude Code 把每个 session 的完整交互记录(包括所有工具调用的输入输出)追加写入日志文件,没有内置的自动轮转机制。手动清理容易遗忘,更好的方法是设置一次、夜间自动跑。

日志文件在哪里

Claude Code 的日志默认写入:

~/.claude/logs/

目录下按 session 分文件,最活跃的那个通常是当前 session 正在写入的。用 du -sh ~/.claude/logs/ 查看总大小,用 ls -lh ~/.claude/logs/ | sort -k5 -rh | head -10 看最大的几个文件。

有时候也会有 ~/.claude/conversation_history/ 目录,同样可能积累大文件。

方案一:macOS launchd(推荐)

launchd 是 macOS 的原生任务调度器,比 cron 更可靠(系统休眠期间跳过执行,醒来后补跑),适合个人机器。

第一步:创建清理脚本

cat > ~/.claude/cleanup-logs.sh << 'EOF'
#!/bin/bash
# Claude Code 日志夜间截断脚本
# 保留每个日志文件的最后 5000 行,删除 30 天未访问的旧文件

LOG_DIR="$HOME/.claude/logs"
KEEP_LINES=5000

if [ ! -d "$LOG_DIR" ]; then
  exit 0
fi

# 截断大于 1MB 的日志文件,保留最后 KEEP_LINES 行
find "$LOG_DIR" -name "*.log" -size +1M | while read -r file; do
  tmp=$(mktemp)
  tail -n "$KEEP_LINES" "$file" > "$tmp"
  mv "$tmp" "$file"
  echo "$(date): truncated $file"
done

# 删除 30 天未访问的旧日志文件
find "$LOG_DIR" -name "*.log" -atime +30 -delete

EOF
chmod +x ~/.claude/cleanup-logs.sh

第二步:创建 launchd plist 文件

cat > ~/Library/LaunchAgents/com.claudecode.cleanup.plist << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.claudecode.cleanup</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/bash</string>
        <string>/Users/YOUR_USERNAME/.claude/cleanup-logs.sh</string>
    </array>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>3</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
    <key>StandardOutPath</key>
    <string>/tmp/claude-cleanup.log</string>
    <key>StandardErrorPath</key>
    <string>/tmp/claude-cleanup.err</string>
    <key>RunAtLoad</key>
    <false/>
</dict>
</plist>
EOF

YOUR_USERNAME 替换成你的 macOS 用户名(whoami 查看)。

第三步:注册和启动

launchctl load ~/Library/LaunchAgents/com.claudecode.cleanup.plist
launchctl list | grep claudecode  # 确认已注册

注册后每天凌晨 3 点自动运行。立即测试是否能跑通:

bash ~/.claude/cleanup-logs.sh

卸载方式:

launchctl unload ~/Library/LaunchAgents/com.claudecode.cleanup.plist
rm ~/Library/LaunchAgents/com.claudecode.cleanup.plist

方案二:Linux cron(简单直接)

# 编辑当前用户的 crontab
crontab -e

# 加入以下行(每天凌晨 3 点运行)
0 3 * * * /bin/bash ~/.claude/cleanup-logs.sh >> /tmp/claude-cleanup.log 2>&1

脚本内容和方案一相同。

方案三:Claude Code PostToolUse Hook(实时轻量控制)

如果不想设置系统级任务调度,可以用 Claude Code 内置的 hook 机制,在每次写入文件后检查并截断:

{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "find ~/.claude/logs -name '*.log' -size +5M -exec sh -c 'tail -n 5000 \"$1\" > \"$1.tmp\" && mv \"$1.tmp\" \"$1\"' _ {} \\;"
          }
        ]
      }
    ]
  }
}

Stop 事件在每次 session 结束时触发。这个 hook 在日志文件超过 5MB 时自动截断保留最后 5000 行。

缺点:如果你经常强制关闭终端(不走正常 session 结束流程),Stop 事件可能不触发。

保留多少行合适

5000 行是一个平衡点:对于标准的 Claude Code session,5000 行大约覆盖 2-4 小时的完整交互记录,足够 debug 最近的问题,同时文件大小控制在几百 KB 以内。

如果你需要更长的历史(比如追溯一周前的操作),把 KEEP_LINES 调到 20000。如果磁盘空间紧张,调到 2000。

手动立即清理

不想设置自动化,手动一次性清理:

# 清空所有日志(保留文件)
find ~/.claude/logs -name "*.log" -exec truncate -s 0 {} \;

# 或者只删除超过 10MB 的文件
find ~/.claude/logs -name "*.log" -size +10M -delete

注意:如果当前有 Claude Code session 正在运行,清理可能会导致当前 session 的日志写入异常。最好在关闭 Claude Code 后再清理。

常见问题

问:清理日志会影响 Claude Code 的功能吗? 答:不会。Claude Code 的日志是追加写入的诊断日志,不是 Claude 的"记忆"或上下文。清理日志不会影响 CLAUDE.md、auto memory、skills 或任何 session 内容。

问:conversation_history/ 目录也需要清理吗? 答:这个目录存的是历史 session 记录,用于 /resume 功能。如果你经常用 /resume 恢复旧 session,不要删除这个目录。如果你不用 /resume,定期清理超过 30 天的内容没有问题。

问:launchd 任务注册后,macOS 重启还会自动运行吗? 答:会。放在 ~/Library/LaunchAgents/ 里的 plist 在每次用户登录时自动注册。

问:可以用 Claude Code 的 hook 直接写自己的 cleanup 逻辑吗? 答:可以。如果你熟悉 bash,在 Stop 事件的 hook 里写任意 shell 命令都行。建议把长逻辑写进独立脚本文件再在 hook 里调用,而不是把几十行命令塞进 JSON 字符串里——可读性和可调试性都会好很多。

参考资料