バイブコーディングを加速させる Vibe Logger入門チュートリアル

ClaudeCodeフレンドリーなログを作るシステムがあれば、バイブコーディングの効率があがるのでは?」という仮説から、GenAI時代のロガーを作ってみた。お暇な方は、仮説検証にお付き合いください。


AI時代のログ作成術:あなたのAI助手がコードを理解できるログを作ろう

従来のログは人間向けでしたが、今やClaude CodeGemini CLIなどのAI助手がコードを理解し、デバッグを手伝ってくれる時代です。

VibeLoggerは、コーディングエージェントが活用しやすい「構造化されたログ」を簡単に作成できるPythonライブラリです。

🎯 なぜVibeCoding Loggerが必要なのか?

従来のログ(人間向け)

import logging
logging.info("User profile fetch failed for user 123")

→ AIには「何が起きたか」しかわからない

VibeCoding Logger(AI向け)

from vibelogger import create_file_logger
logger = create_file_logger("my_app")

logger.info(
    operation="fetchUserProfile",
    message="User profile fetch failed", 
    context={
        "user_id": 123,
        "database": "users_db",
        "query": "SELECT * FROM profiles WHERE id = ?",
        "error_code": "NOT_FOUND"
    },
    human_note="AI-TODO: ユーザー存在確認を追加してください"
)

→ AIには「なぜ」「どこで」「どうすべきか」まで伝わる。ロガーのコードはAIが書くため、冗長でも人間の負担が発生しない。

VibeLoggerを使うことで、AIが活用できる情報が大きく増加する。

🚀 はじめての10分

ステップ1: インストール(python)

pip install vibelogger

ステップ1: インストール(node.js)

npm install vibelogger


CLAUDE.md に書く

### ロギング ###
* ライブラリ: vibelogger
* 使い方: https://github.com/fladdict/vibe-logger
* vibeloggerはコーディングエージェント用に高度な構造化データを出力するロガーです。
* ログにはvibeloggerを可能な限り利用し、ログからAIが自律的に何が起きてるかを把握できるようにする
* vibeloggerにはステップ、プロセス、コンテキスト情報、TODOなど様々な情報を構造化して記録できます。
* デバッグ時には./logsの出力を参照する



よりちゃんと理解する場合

ステップ2: 最初のログ

from vibelogger import create_file_logger

# タイムスタンプ付きファイルに自動保存されるロガーを作成
logger = create_file_logger("tutorial_app")

# 最初のログを記録
logger.info(
    operation="hello_world",
    message="VibeCoding Loggerを始めました!",
    context={"version": "1.0", "language": "Python"}
)

print("ログファイルを確認してください: ./logs/tutorial_app/")

これだけで、AIが理解しやすい構造化ログが`./logs/tutorial_app/vibe_YYYYMMDD_HHMMSS.log`に保存されます!

ステップ3: ログファイルを確認

作成されたJSONログを見てみましょう:

{
  "timestamp": "2025-01-15T10:30:45.123Z",
  "level": "INFO",
  "correlation_id": "req_abc123",
  "operation": "hello_world", 
  "message": "VibeCoding Loggerを始めました!",
  "context": {
    "version": "1.0",
    "language": "Python"
  },
  "environment": {
    "python_version": "3.11.0",
    "os": "Darwin"
  },
  "source": "tutorial.py:8 in <module>()"
}

💡 実践例:ユーザー管理システム

実際のWebアプリケーションでの使用例を見てみましょう:

from vibelogger import create_file_logger
import uuid

# アプリケーション用のロガーを作成
logger = create_file_logger("user_management")

def register_user(email, password):
    """新規ユーザー登録"""
    
    # 操作開始をログ
    logger.info(
        operation="user_registration_start",
        message=f"新規ユーザー登録を開始",
        context={
            "email": email,
            "method": "register_user",
            "input_validation": "pending"
        },
        human_note="この処理でエラーが出る場合は、バリデーション関数を確認してください"
    )
    
    # バリデーション
    if not email or "@" not in email:
        logger.error(
            operation="user_registration_validation",
            message="無効なメールアドレス",
            context={
                "email": email,
                "validation_failed": "email_format",
                "requirements": "must contain @ symbol"
            },
            ai_todo="メールバリデーション強化を提案してください"
        )
        return {"success": False, "error": "Invalid email"}
    
    # データベース保存(模擬)
    try:
        user_id = str(uuid.uuid4())
        
        # 成功ログ
        logger.info(
            operation="user_registration_success", 
            message="ユーザー登録完了",
            context={
                "user_id": user_id,
                "email": email,
                "database_table": "users",
                "registration_method": "email_password"
            },
            human_note="新規ユーザー登録が成功しました"
        )
        
        return {"success": True, "user_id": user_id}
        
    except Exception as e:
        # エラーログ
        logger.log_exception(
            operation="user_registration_database_error",
            exception=e,
            context={
                "email": email,
                "database_operation": "INSERT INTO users",
                "retry_count": 0
            },
            ai_todo="データベース接続エラーの対処法を提案してください"
        )
        return {"success": False, "error": "Database error"}

# 使用例
result1 = register_user("[email protected]", "password123")
result2 = register_user("invalid-email", "password123")  # エラーケース

🔧 AIとの連携

Claude Codeでのデバッグ

ログが蓄積されたら、Claude Codeに分析を依頼できます:

./logs フォルダのログを分析して。

相関IDによる追跡

関連する処理を紐づけて追跡:

# リクエスト開始時に相関IDを設定
correlation_id = f"req_{uuid.uuid4()}"
logger = create_logger(correlation_id=correlation_id)

def process_user_request(user_id):
    logger.info("request_start", "リクエスト処理開始", 
                context={"user_id": user_id})
    
    # 複数の処理...
    validate_user(user_id)
    fetch_user_data(user_id) 
    update_user_profile(user_id)
    
    logger.info("request_complete", "リクエスト処理完了",
                context={"user_id": user_id, "duration_ms": 245})

def validate_user(user_id):
    # 同じ相関IDで関連処理をログ
    logger.info("user_validation", "ユーザー検証開始", 
                context={"user_id": user_id, "step": 1})

📊 ログの活用パターン

1. エラー分析

# エラー専用フィルタ
error_logs = logger.get_logs_for_ai()
# Claude Codeに: "エラーログだけを分析して問題を特定してください"

2. パフォーマンス分析

logger.info(
    operation="database_query",
    message="ユーザーリスト取得",
    context={
        "query": "SELECT * FROM users WHERE active = true",
        "execution_time_ms": 1250,
        "result_count": 1523,
        "cache_hit": False
    },
    human_note="実行時間が長い場合はインデックスを確認"
)

3. ユーザー行動分析

logger.info(
    operation="user_action",
    message="商品検索実行", 
    context={
        "user_id": "user_123",
        "search_query": "iPhone",
        "result_count": 45,
        "page_number": 1,
        "user_session": "session_xyz"
    },
    human_note="人気検索クエリの分析に活用"
)

⚙️ 設定とカスタマイズ

環境変数での設定

# .env ファイル
VIBE_LOG_FILE=./custom_logs/app.log
VIBE_MAX_FILE_SIZE_MB=50
VIBE_AUTO_SAVE=true
from vibelogger import create_env_logger

# 環境変数から設定を読み込み
logger = create_env_logger()

カスタム設定

from vibelogger import create_logger, VibeLoggerConfig

config = VibeLoggerConfig(
    log_file="./production_logs/app.log",
    max_file_size_mb=100,         # 100MBでローテーション
    max_memory_logs=5000,         # メモリに5000件まで保持
    keep_logs_in_memory=True,     # メモリ保存有効
    auto_save=True                # 自動ファイル保存
)

logger = create_logger(config=config)

メモリ効率化(長時間実行向け)

# 大量ログを扱うバッチ処理用設定
config = VibeLoggerConfig(
    keep_logs_in_memory=False,    # メモリ保存無効
    auto_save=True,               # ファイル保存のみ
    max_file_size_mb=200         # 大きなファイルサイズ
)

batch_logger = create_logger(config=config)

🎯 実践Tips

1. 適切な`operation`命名

# Good: 動詞_名詞_詳細
logger.info("fetch_user_profile", ...)
logger.info("validate_email_format", ...)
logger.info("save_user_preferences", ...)

# Bad: 曖昧な命名
logger.info("process", ...)
logger.info("check", ...)

2. contextの構造化

# Good: 構造化されたcontext
context = {
    "user": {"id": 123, "email": "[email protected]"},
    "database": {"table": "users", "query_time_ms": 45},
    "request": {"ip": "192.168.1.1", "user_agent": "Chrome/95"}
}

# Bad: フラットすぎる
context = {
    "user_id": 123, 
    "email": "[email protected]",
    "db_table": "users",
    "query_time": 45,
    "ip": "192.168.1.1"
}

3. human_noteとai_todoの使い分け

# human_note: 人間への説明
human_note="この処理は外部APIを呼ぶため、ネットワークエラーが発生する可能性があります"

# ai_todo: AIへの依頼
ai_todo="このエラーパターンに対する自動リトライ機能の実装を提案してください"

🚨 トラブルシューティング

よくある問題と解決法

Q: ログファイルが作成されない

# 権限エラーの可能性 - デバッグ用設定
logger = create_logger(
    log_file=None,  # ファイル保存無効
    keep_logs_in_memory=True  # メモリのみ
)

# メモリ内容を確認
print(logger.get_logs_for_ai())

Q: ログが多すぎてファイルが巨大になる

# ローテーション設定
config = VibeLoggerConfig(
    max_file_size_mb=10,  # 10MBで自動ローテーション
    max_memory_logs=100   # メモリは100件まで
)

Q: 循環参照エラー

# 自動的に[Circular Reference]に変換されるため、通常は問題なし
# もし発生した場合は、contextを単純化
simplified_context = {
    "user_id": user.id,  # オブジェクト全体ではなくIDのみ
    "action": "update"
}

🎓 まとめ

VibeCoding Loggerを使うことで:

  1. AIが理解しやすい構造化ログを簡単に作成

  2. Claude CodeやGitHub Copilotとの連携でデバッグ効率化

  3. 相関IDで関連処理を追跡

  4. 人間とAI両方が読みやすい形式

Happy Vibe Coding! 🚀

自分で使って、ゴリゴリ改造してくと思うので、お気軽にフィードバックくださいませ。


📚 関連リンク

いいなと思ったら応援しよう!

深津 貴之 (fladdict) いただいたサポートは、コロナでオフィスいけてないので、コロナあけにnoteチームにピザおごったり、サービス設計の参考書籍代にします。