跳转到内容

会话可观测性与监控

Claude Code 的使用量在活跃开发期间会快速累积。本指南涵盖如何搜索和恢复会话、设置日志记录、分析使用数据、估算成本、监控活动,以及集成外部可观测性工具。


了解成本

在账单到来之前估算 API 支出。

识别模式

查看最常使用的工具、哪些文件被反复编辑。

优化工作流

发现低效操作,比如反复读取同一个大文件。

团队可见性

汇总使用日志,用于团队预算规划。


命令用途
claude -c / claude --continue恢复最近的会话
claude -r <id> / claude --resume <id>通过 ID 恢复指定会话
claude --resume交互式会话选择器

会话以 JSONL 文件格式存储在 ~/.claude/projects/<project>/

工具安装方式速度依赖恢复支持
session-search.sh复制脚本列表 10ms / 搜索 400ms无(纯 bash)显示恢复命令
claude-conversation-extractorpip install230ms / 1.7sPython
claude-code-transcriptsuvxN/APython
ran CLInpm -gNode.js

零依赖的 bash 脚本,为速度优化,提供可直接使用的恢复命令。

安装:

Terminal window
cp examples/scripts/session-search.sh ~/.claude/scripts/cs
chmod +x ~/.claude/scripts/cs
echo "alias cs='~/.claude/scripts/cs'" >> ~/.zshrc
source ~/.zshrc

使用:

Terminal window
cs # 列出最近 10 个会话(约 15ms)
cs "authentication" # 单关键词搜索(约 400ms)
cs "Prisma migration" # 多词 AND 搜索
cs -n 20 # 显示 20 个结果
cs -p myproject "bug" # 按项目名过滤
cs --since 7d # 最近 7 天的会话
cs --since today # 仅今天的会话
cs --json "api" | jq . # JSON 输出用于脚本

输出示例:

2026-01-15 08:32 | my-project | Implement OAuth flow for...
claude --resume 84287c0d-8778-4a8d-abf1-eb2807e327a8
2026-01-14 21:13 | other-project | Fix database migration...
claude --resume 1340c42e-eac5-4181-8407-cc76e1a76219

复制粘贴 claude --resume 命令即可继续任意会话。

移动项目时的手动迁移:

Terminal window
# 移动项目前
cd ~/.claude/projects/
ls -la # 记录当前的编码路径
# 移动项目
mv /old/location/myapp /new/location/myapp
# 重命名会话目录以匹配新路径
cd ~/.claude/projects/
mv -- -old-location-myapp- -new-location-myapp-
# 验证
cd /new/location/myapp
claude --continue # 应该能成功恢复

  1. 安装 Logger Hook

    Terminal window
    mkdir -p ~/.claude/hooks
    cp examples/hooks/bash/session-logger.sh ~/.claude/hooks/
    chmod +x ~/.claude/hooks/session-logger.sh
  2. 注册到配置文件

    添加到 ~/.claude/settings.json

    {
    "hooks": {
    "PostToolUse": [
    {
    "type": "command",
    "command": "~/.claude/hooks/session-logger.sh"
    }
    ]
    }
    }
  3. 验证安装

    Terminal window
    ls ~/.claude/logs/
    # 应该看到:activity-2026-01-14.jsonl
    tail -5 ~/.claude/logs/activity-$(date +%Y-%m-%d).jsonl | jq .
环境变量默认值说明
CLAUDE_LOG_DIR~/.claude/logs日志存储位置
CLAUDE_LOG_TOKENStrue启用 token 估算
CLAUDE_SESSION_ID自动生成自定义会话标识符

Terminal window
session-stats.sh # 今日汇总
session-stats.sh --range week # 最近 7 天
session-stats.sh --date 2026-01-14 # 指定日期
session-stats.sh --project my-app # 按项目过滤
session-stats.sh --json # 机器可读输出
═══════════════════════════════════════════════════════════
Claude Code Session Statistics - today
═══════════════════════════════════════════════════════════
Summary
Total operations: 127
Sessions: 3
Token Usage
Input tokens: 45,230
Output tokens: 12,450
Total tokens: 57,680
Estimated Cost (Sonnet rates)
Input: $0.1357
Output: $0.1868
Total: $0.3225
Tools Used
Edit: 45
Read: 38
Bash: 24
Grep: 12
Write: 8
Projects
my-app: 89
other-project: 38

Token 统计告诉你使用了多少 Claude Code。JSONL 日志还能揭示你的配置效果如何

以下三种模式通常表明技能、规则或 CLAUDE.md 需要更新:

如果 Claude 在一个会话中读取同一文件 3 次以上,说明它需要的内容可能不在预期位置。

Terminal window
# 最近会话中被读取 3 次以上的文件
jq -r 'select(.tool == "Read") | .file' ~/.claude/logs/activity-*.jsonl \
| sort | uniq -c | sort -rn | awk '$1 > 3'

解决方案:将相关上下文移到技能或 CLAUDE.md 中。

每条日志是一个 JSON 对象:

{
"timestamp": "2026-01-14T15:30:00Z",
"session_id": "1705234567-12345",
"tool": "Edit",
"file": "src/components/Button.tsx",
"project": "my-app",
"tokens": {
"input": 350,
"output": 120,
"total": 470
}
}

Logger 使用简单的启发式方法估算 token:约每 4 个字符为 1 个 token。这是近似值,通常会略微高估。

默认费率为 Claude Sonnet。通过环境变量调整:

Terminal window
# Sonnet 费率(默认)
export CLAUDE_RATE_INPUT=0.003 # $3/1M tokens
export CLAUDE_RATE_OUTPUT=0.015 # $15/1M tokens
# Opus 费率
export CLAUDE_RATE_INPUT=0.015 # $15/1M tokens
export CLAUDE_RATE_OUTPUT=0.075 # $75/1M tokens
# Haiku 费率
export CLAUDE_RATE_INPUT=0.00025 # $0.25/1M tokens
export CLAUDE_RATE_OUTPUT=0.00125 # $1.25/1M tokens

在 shell 配置文件中添加每日预算提醒:

Terminal window
# ~/.zshrc 或 ~/.bashrc
claude_budget_check() {
local cost=$(session-stats.sh --json 2>/dev/null | jq -r '.summary.estimated_cost.total // 0')
local threshold=5.00 # 每日 $5 预算
if (( $(echo "$cost > $threshold" | bc -l) )); then
echo "警告:Claude Code 今日支出 \$$cost(阈值:\$$threshold"
fi
}
# Shell 启动时运行
claude_budget_check

Claude Code 执行的每个工具调用都记录在 ~/.claude/projects/<project>/ 下的会话 JSONL 文件中。每个 type: "assistant" 条目包含一个 content 数组,其中 type: "tool_use" 记录了每个操作。

Terminal window
# 检查会话中的工具调用
cat ~/.claude/projects/-your-project-/SESSION_ID.jsonl | \
jq 'select(.type == "assistant") | .message.content[]? | select(.type == "tool_use") | {tool: .name, input: .input}'
工具暴露的信息
Read被访问的文件(路径、行范围)
Write / Edit被修改的文件(路径、内容变更)
Bash执行的命令(完整命令字符串)
WebFetch获取的 URL(可能包含 POST 数据)
Task子 Agent 启动(传递的提示词)
Glob / Grep搜索模式和范围
Terminal window
SESSION=~/.claude/projects/-your-project-/SESSION_ID.jsonl
# 会话中读取的所有文件
jq 'select(.type == "assistant") | .message.content[]? | select(.type == "tool_use" and .name == "Read") | .input.file_path' "$SESSION"
# 执行的所有 bash 命令
jq 'select(.type == "assistant") | .message.content[]? | select(.type == "tool_use" and .name == "Bash") | .input.command' "$SESSION"
# 获取的所有 URL
jq 'select(.type == "assistant") | .message.content[]? | select(.type == "tool_use" and .name == "WebFetch") | .input.url' "$SESSION"
# 按类型统计工具使用量
jq -r 'select(.type == "assistant") | .message.content[]? | select(.type == "tool_use") | .name' "$SESSION" | sort | uniq -c | sort -rn
模式风险检测方法
Read 访问 .env*.pemid_rsa凭据被访问过滤文件路径中的 \.(env|pem|key)$
Bash 执行 rm -rfgit push --force破坏性操作过滤危险命令模式
WebFetch 外部 URL数据泄露风险审计所有获取的 URL
Write 项目根目录外的文件作用域溢出检查路径是否在工作目录内

工具类型功能安装
ccusageCLI / TUI从 JSONL 追踪成本,约 10K GitHub 星标npm i -g ccusage
claude-code-otelOpenTelemetry向任意 OTEL 收集器发送 Spannpm i -g claude-code-otel
AktoSaaS / 自托管API 安全防护 + 审计追踪akto.io
MLflow TracingCLI + SDK精确 token 计数、工具 Span、LLM 评判pip install mlflow
ccboardTUI + Web统一的会话、成本和统计仪表板cargo install ccboard
需要快速了解成本? → ccusage(CLI,零配置)
需要企业级审计追踪? → claude-code-otel + Grafana 或 Akto
已在使用 MLflow 做 ML? → MLflow tracing 集成
需要 Agent 回归检测? → MLflow tracing + LLM-as-judge
需要持久化 TUI/Web UI? → ccboard
Terminal window
npm i -g ccusage
ccusage # 今日用量
ccusage --days 7 # 最近 7 天

直接从 ~/.claude/projects/**/*.jsonl 读取,无需 API 密钥,不发送外部数据。

Terminal window
npm i -g claude-code-otel
claude-code-otel --collector http://localhost:4318

Span 包含工具名称、持续时间和 token 计数。可接入任何兼容 OTEL 的后端(Jaeger、Tempo、Datadog)。

Terminal window
pip install "mlflow[genai]>=3.4"
# 启用追踪
mlflow autolog claude
# 使用自定义后端
mlflow autolog claude -u sqlite:///mlflow.db
# 查看状态 / 禁用
mlflow autolog claude --status
mlflow autolog claude --disable

启动 UI:

Terminal window
mlflow server # http://localhost:5000

自动捕获的内容:用户提示词、助手响应、工具调用(名称 + 输入 + 输出)、精确 token 计数、每次调用延迟和会话元数据。

Claude Code 可以直接查询自己的追踪数据:

{
"mcpServers": {
"mlflow-mcp": {
"command": "uv",
"args": ["run", "--with", "mlflow[mcp]>=3.5.1", "mlflow", "mcp", "run"],
"env": { "MLFLOW_TRACKING_URI": "<your-tracking-uri>" }
}
}
}

配置完成后,你可以直接问 Claude Code:「找出所有 backend-architect agent 使用超过 20 次工具调用的会话」——它会直接查询 MLflow。


让 Node.js 信任你的代理 CA 证书:

Terminal window
export NODE_EXTRA_CA_CERTS="/path/to/proxyman-ca.pem"
claude

注意:某些 Claude Code 版本使用证书锁定,这种方法可能仍然失败。


Terminal window
session-stats.sh --range week

关注以下指标:

  • Token 异常高峰日
  • 同一文件的重复操作(效率不佳的信号)
  • 项目分布(时间花在了哪里)
Terminal window
export CLAUDE_SESSION_ID="project-myapp-$(date +%s)"
claude
Terminal window
# 每日同步到 S3
aws s3 sync ~/.claude/logs/ s3://company-claude-logs/$(whoami)/
# 合并分析
aws s3 sync s3://company-claude-logs/ /tmp/team-logs/
cat /tmp/team-logs/*/activity-$(date +%Y-%m-%d).jsonl | \
jq -s 'group_by(.project) | map({project: .[0].project, total_tokens: [.[].tokens.total] | add})'
Terminal window
# 清理 30 天前的日志
find ~/.claude/logs -name "*.jsonl" -mtime +30 -delete

限制原因
精确的 token 计数CLI 不暴露 API token 指标
TTFT(首 token 时间)Hook 在工具完成后才运行
实时流式指标响应生成期间没有 Hook 事件
实际 API 费用Token 估算基于启发式方法
每请求的模型选择日志不记录使用了哪个模型
上下文窗口使用率无法查看当前上下文占比
指标准确度
工具使用次数每个工具调用的精确计数
文件访问模式哪些文件被操作过
相对比较日与日、项目与项目之间的趋势
操作时间工具使用的时间戳
Token 估算与实际账单偏差约 15-25%