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

重度使用 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 字符串里——可读性和可调试性都会好很多。