跳转至

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"

赋予执行权限:

chmod +x ~/.claude/hooks/log-activity.sh

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 statusls 等只读命令
  • PreToolUse 拦截:在敏感操作(如 rmgit push)前弹出确认
  • 统计分析:定期统计各工具使用频率、活跃时段

总结

利用 Claude Code 的 Hook 机制,用一个 20 行的 shell 脚本实现了全自动操作日志,零 token 消耗、全局生效、不会遗漏。配置一次,永久受益。