既有 Stop 钩子 token-stats-hook 记的是跨会话累计快照, 无法区分"这次会话 用了多少"; session-end-log 在 SessionEnd 时按 session_id 解析本次 transcript 做单会话统计, 产出一行可回溯的索引写入 ~/.claude/log.md, 方便事后盘点 哪场会话烧了哪些 token。Python 写零依赖, Ubuntu 自带 python3 免构建。
52 lines
1.3 KiB
Markdown
52 lines
1.3 KiB
Markdown
# session-end-log
|
||
|
||
Claude Code SessionEnd hook:每次会话结束时在 `~/.claude/log.md` 追加一行元数据 + token 用量。
|
||
|
||
用 Python 编写,零依赖(Ubuntu 自带 `python3`)。
|
||
|
||
## 输出格式
|
||
|
||
```
|
||
- 2026-04-21T00:55:30 | session=353cbdc1 | cwd=/home/charles | reason=clear | tokens=total:592.7k in:39 out:3.7k cache_r:558.2k cache_w:30.7k
|
||
```
|
||
|
||
字段:
|
||
- `reason`:`clear` / `logout` / `resume` / `prompt_input_exit` 之一
|
||
- `session`:session_id 前 8 位
|
||
- `tokens`:读取该会话的 transcript(`~/.claude/projects/<slug>/<sid>.jsonl`)按 `type=assistant` 的 usage 累加;transcript 读不到时降级为 `tokens=unavailable`,不阻塞会话退出
|
||
|
||
## 安装
|
||
|
||
```bash
|
||
mkdir -p ~/.claude/hooks
|
||
cp hooks/session-end-log/session-end-log.py ~/.claude/hooks/
|
||
chmod +x ~/.claude/hooks/session-end-log.py
|
||
```
|
||
|
||
然后在 `~/.claude/settings.json` 的 `hooks` 下加入(与现有 `Stop` 等共存):
|
||
|
||
```json
|
||
{
|
||
"hooks": {
|
||
"SessionEnd": [
|
||
{
|
||
"hooks": [
|
||
{
|
||
"type": "command",
|
||
"command": "python3 ~/.claude/hooks/session-end-log.py 2>/dev/null || true"
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
## 测试
|
||
|
||
```bash
|
||
echo '{"cwd":"/home/charles","reason":"test","session_id":"<real-session-id>"}' \
|
||
| python3 ~/.claude/hooks/session-end-log.py
|
||
tail -1 ~/.claude/log.md
|
||
```
|