Claude Code Hook 实现零 Token 操作日志¶
日期:2026-04-19 环境:Claude Code + macOS
一、问题¶
Claude Code 默认没有自动记录操作的机制。如果让 AI 在每次操作后手动写日志,每条记录消耗 100-300 tokens,长期下来是一笔不小的开销。
| 方式 | Token 消耗 | 可靠性 |
|---|---|---|
| AI 手动写日志 | 100-300/次 | 可能遗漏 |
| PostToolUse Hook | 0 | 100% 触发 |
二、方案¶
利用 Claude Code 的 Hooks 机制 —— 在指定事件发生时自动执行 shell 脚本。
配置 PostToolUse hook,每次 Claude 调用写操作工具(Edit/Write/Bash)后,自动往日志文件追加一行记录。整个过程由 shell 完成,AI 不参与,零 token 消耗。
三、实现¶
3.1 创建 hook 脚本¶
创建 ~/.claude/hooks/log-activity.sh:
#!/bin/bash
# Claude Code PostToolUse Hook — 全局活动日志
LOG_FILE="$HOME/.claude/activity-log.md"
INPUT=$(cat)
TOOL=$(echo "$INPUT" | python3 -c \
"import sys,json; print(json.load(sys.stdin).get('tool_name',''))" 2>/dev/null)
FILE=$(echo "$INPUT" | python3 -c \
"import sys,json; i=json.load(sys.stdin).get('tool_input',{}); \
print(i.get('file_path','') or i.get('command','')[:80] \
if isinstance(i,dict) else '')" 2>/dev/null)
# 只记录写操作
case "$TOOL" in
Edit|Write|Bash|NotebookEdit) ;;
*) exit 0 ;;
esac
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
CWD=$(pwd)
# 首次运行时自动创建表头
if [ ! -f "$LOG_FILE" ]; then
cat > "$LOG_FILE" << 'HEADER'
# Claude Code 全局活动日志
> 由 PostToolUse hook 自动记录,零 token 消耗。
| 时间 | 工具 | 工作目录 | 目标 |
|------|------|---------|------|
HEADER
fi
echo "| $TIMESTAMP | $TOOL | \`$CWD\` | \`${FILE:-N/A}\` |" >> "$LOG_FILE"
赋予执行权限:
3.2 注册 Hook¶
编辑 ~/.claude/settings.json,添加 hooks 字段:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write|Bash|NotebookEdit",
"command": "/Users/你的用户名/.claude/hooks/log-activity.sh"
}
]
}
}
matcher 使用正则匹配工具名,只有匹配的工具才会触发 hook。
四、日志效果¶
每次操作后,~/.claude/activity-log.md 自动追加一行:
| 时间 | 工具 | 工作目录 | 目标 |
|------|------|---------|------|
| 2026-04-19 15:30:12 | Edit | `/Users/x/Documents/xvuln.com` | `docs/tools/deploy.md` |
| 2026-04-19 15:30:15 | Bash | `/Users/x/Documents/xvuln.com` | `mkdocs build` |
| 2026-04-19 15:31:00 | Write | `/Users/x/Documents/project-b` | `src/config.py` |
五、Hook 机制说明¶
Claude Code 支持以下 hook 事件:
| 事件 | 触发时机 |
|---|---|
PreToolUse | 工具执行前(可拦截) |
PostToolUse | 工具执行后 |
Notification | 通知发出时 |
Stop | 对话轮次结束时 |
hook 脚本通过 stdin 接收 JSON 数据,包含工具名和输入参数。脚本的 stdout 会作为反馈返回给 Claude,stderr 用于调试。
六、扩展思路¶
- 按项目分文件:根据工作目录将日志写到对应项目的
ACTIVITY_LOG.md - 过滤噪音:在脚本中排除
git status、ls等只读命令 - PreToolUse 拦截:在敏感操作(如
rm、git push)前弹出确认 - 统计分析:定期统计各工具使用频率、活跃时段
总结¶
利用 Claude Code 的 Hook 机制,用一个 20 行的 shell 脚本实现了全自动操作日志,零 token 消耗、全局生效、不会遗漏。配置一次,永久受益。