Skip to content

Claudeの作業ログを自動保存する

Claudeが行ったすべての操作(ファイルの編集・コマンドの実行)を自動的にログファイルに記録します。

「Claudeが何かやってくれたけど、どのファイルを変更したっけ?」「昨日のセッションで何を実装したか思い出せない」という状況を解消します。チームのナレッジ共有や、後日の振り返りにも活用できます。

Hooks: Claude Codeの特定の操作(ツール実行前後など)に独自のシェルコマンドを自動実行できる設定機能。
{
"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"
}
]
}
]
}
}
{
"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"
}
]
}
]
}
}

プロジェクトごとに分かれたログファイルを作成するスクリプトです。

~/.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 0
Terminal window
chmod +x ~/.claude/hooks/auto-log.sh

settings.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やサーバーに設定する仕組み。
Terminal window
# 今日の全プロジェクトのログ
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 “変更されたファイルの一覧を取得する”
Terminal window
# 今日編集されたファイルの重複なし一覧
grep -h "\[EDIT\]\|\[WRITE\]" ~/.claude/logs/$(date '+%Y-%m-%d')_*.log | \
awk '{print $NF}' | sort | uniq
Terminal window
# 日報生成スクリプト
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 0
fi
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"
#!/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専用の設定ファイル。プロジェクト固有のルールやコンテキストを記述する。