Claudeの作業ログを自動保存する
何をするHooksか
Section titled “何をするHooksか”Claudeが行ったすべての操作(ファイルの編集・コマンドの実行)を自動的にログファイルに記録します。
「Claudeが何かやってくれたけど、どのファイルを変更したっけ?」「昨日のセッションで何を実装したか思い出せない」という状況を解消します。チームのナレッジ共有や、後日の振り返りにも活用できます。
※Hooks: Claude Codeの特定の操作(ツール実行前後など)に独自のシェルコマンドを自動実行できる設定機能。
settings.json の実際のコード
Section titled “settings.json の実際のコード”シンプルな編集ログ
Section titled “シンプルな編集ログ”{ "hooks": { "PostToolUse": [ { "matcher": "Edit|Write", "hooks": [ { "type": "command", "command": "FILE=$(echo $CLAUDE_TOOL_INPUT | jq -r '.file_path'); echo \"[$(date '+%Y-%m-%d %H:%M:%S')] EDIT: $FILE\" >> ~/.claude/work-log.txt" } ] } ] }}コマンド実行ログ
Section titled “コマンド実行ログ”{ "hooks": { "PostToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "command": "CMD=$(echo $CLAUDE_TOOL_INPUT | jq -r '.command'); echo \"[$(date '+%Y-%m-%d %H:%M:%S')] CMD: $CMD\" >> ~/.claude/work-log.txt" } ] } ] }}詳細なログスクリプト
Section titled “詳細なログスクリプト”プロジェクトごとに分かれたログファイルを作成するスクリプトです。
~/.claude/hooks/auto-log.sh:
#!/bin/bash
# 設定LOG_DIR="${HOME}/.claude/logs"DATE=$(date '+%Y-%m-%d')TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')PROJECT_NAME=$(basename "${CLAUDE_PROJECT_DIR:-$(pwd)}")LOG_FILE="${LOG_DIR}/${DATE}_${PROJECT_NAME}.log"
# ログディレクトリを作成mkdir -p "$LOG_DIR"
# ツールの種類を取得(環境変数から取得できないのでスクリプト引数で渡す方法もある)TOOL_NAME="${1:-UNKNOWN}"
# ツールに応じてログ内容を変えるcase "$TOOL_NAME" in "Edit"|"Write") FILE_PATH=$(echo "$CLAUDE_TOOL_INPUT" | jq -r '.file_path // "unknown"') echo "[${TIMESTAMP}] [${TOOL_NAME}] ${FILE_PATH}" >> "$LOG_FILE" ;; "Bash") COMMAND=$(echo "$CLAUDE_TOOL_INPUT" | jq -r '.command // "unknown"') # 長いコマンドは100文字で切る SHORT_CMD="${COMMAND:0:100}" echo "[${TIMESTAMP}] [BASH] ${SHORT_CMD}" >> "$LOG_FILE" ;; "Read") FILE_PATH=$(echo "$CLAUDE_TOOL_INPUT" | jq -r '.file_path // "unknown"') echo "[${TIMESTAMP}] [READ] ${FILE_PATH}" >> "$LOG_FILE" ;; *) echo "[${TIMESTAMP}] [${TOOL_NAME}] $(echo "$CLAUDE_TOOL_INPUT" | jq -c . 2>/dev/null | head -c 200)" >> "$LOG_FILE" ;;esac
exit 0chmod +x ~/.claude/hooks/auto-log.shsettings.json:
{ "hooks": { "PostToolUse": [ { "matcher": "Edit", "hooks": [ { "type": "command", "command": "~/.claude/hooks/auto-log.sh Edit" } ] }, { "matcher": "Write", "hooks": [ { "type": "command", "command": "~/.claude/hooks/auto-log.sh Write" } ] }, { "matcher": "Bash", "hooks": [ { "type": "command", "command": "~/.claude/hooks/auto-log.sh Bash" } ] } ], "Stop": [ { "matcher": "", "hooks": [ { "type": "command", "command": "echo \"[$(date '+%Y-%m-%d %H:%M:%S')] === セッション終了 ===\" >> ~/.claude/logs/$(date '+%Y-%m-%d')_$(basename ${CLAUDE_PROJECT_DIR:-unknown}).log" } ] } ] }}※環境変数: APIキーやデータベース接続情報など、コードに直接書きたくない値をOSやサーバーに設定する仕組み。
ログの見方と活用例
Section titled “ログの見方と活用例”今日のログを確認する
Section titled “今日のログを確認する”# 今日の全プロジェクトのログcat ~/.claude/logs/$(date '+%Y-%m-%d')_*.log
# 特定プロジェクトのログcat ~/.claude/logs/$(date '+%Y-%m-%d')_myproject.log
# 編集されたファイルだけ確認grep "\[EDIT\]\|\[WRITE\]" ~/.claude/logs/$(date '+%Y-%m-%d')_*.log変更されたファイルの一覧を取得する
Section titled “変更されたファイルの一覧を取得する”# 今日編集されたファイルの重複なし一覧grep -h "\[EDIT\]\|\[WRITE\]" ~/.claude/logs/$(date '+%Y-%m-%d')_*.log | \ awk '{print $NF}' | sort | uniqログをMarkdownの日報にする
Section titled “ログをMarkdownの日報にする”# 日報生成スクリプトcat ~/.claude/logs/$(date '+%Y-%m-%d')_myproject.log | \ grep -v "^\[.*\] \[READ\]" | \ sed 's/\[EDIT\]/✏️ 編集/g' | \ sed 's/\[BASH\]/⚡ 実行/g'セッションサマリーの自動生成
Section titled “セッションサマリーの自動生成”Stopフックと組み合わせて、セッション終了時にサマリーを生成する:
~/.claude/hooks/session-summary.sh:
#!/bin/bash
TODAY=$(date '+%Y-%m-%d')PROJECT_NAME=$(basename "${CLAUDE_PROJECT_DIR:-unknown}")LOG_FILE="${HOME}/.claude/logs/${TODAY}_${PROJECT_NAME}.log"
if [ ! -f "$LOG_FILE" ]; then exit 0fi
EDIT_COUNT=$(grep -c "\[EDIT\]\|\[WRITE\]" "$LOG_FILE" 2>/dev/null || echo "0")BASH_COUNT=$(grep -c "\[BASH\]" "$LOG_FILE" 2>/dev/null || echo "0")
echo "" >> "$LOG_FILE"echo "--- セッションサマリー ---" >> "$LOG_FILE"echo "ファイル編集: ${EDIT_COUNT}件" >> "$LOG_FILE"echo "コマンド実行: ${BASH_COUNT}件" >> "$LOG_FILE"echo "------------------------" >> "$LOG_FILE"カスタマイズ例
Section titled “カスタマイズ例”GitHubのIssue番号と紐付けるログ
Section titled “GitHubのIssue番号と紐付けるログ”#!/bin/bash# セッション開始時にIssue番号を入力させるパターン# (実際はCLAUDE.mdに「作業Issue番号: #123」と書いておく)
ISSUE=$(grep "作業Issue" "${CLAUDE_PROJECT_DIR}/CLAUDE.md" 2>/dev/null | grep -o '#[0-9]*')FILE_PATH=$(echo "$CLAUDE_TOOL_INPUT" | jq -r '.file_path')echo "[$(date '+%Y-%m-%d %H:%M:%S')] ${ISSUE} EDIT: ${FILE_PATH}" >> ~/.claude/work-log.txt※CLAUDE.md: プロジェクトのルートに置くClaude Code専用の設定ファイル。プロジェクト固有のルールやコンテキストを記述する。