mcpField
S
structured-logging

structured-logging

github.com/majesticlabs-dev開発5051 回インストール7 週間前に更新
リポジトリ

structured-logging について

structured-loggingは、検索しやすいJSONログの設計と分散サービスの障害調査を支援する開発スキルです。ログライブラリではなく、フィールド、コンテキスト伝播、レベル、性能に関する指針を示します。

主な機能

  1. 01JSONキー・バリュー形式
  2. 02必須フィールドと相関ID
  3. 03ログレベルの選択指針
  4. 04サービス間のコンテキスト伝播
  5. 05機密データとノイズの回避
  6. 06性能とサンプリングの指針

活用シーン

  1. 01サービス間でイベントフィールドを統一
  2. 02分散システム内のリクエストを追跡
  3. 03障害や想定内イベントのレベルを選択
  4. 04インシデント調査でログを確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/majesticlabs-dev/majestic-marketplace --skill structured-logging

インストール後、Claude Code で/structured-loggingを入力して読み込まれたか確認します。

詳細

構造化ロギング

基本理念

  • ログは書き込みではなく、検索に最適化します。デバッグを意識して設計してください
  • 分散システムでは、相関 ID のないログは役に立ちません
  • 「誰に影響があったか?何が失敗したか?いつ?なぜ?」に 5 分以内に答えられない場合は、ロギングを改善する必要があります

構造化形式

文字列補間は使わず、常にキーと値のペア(JSON)を使用してください。

{
  "event": "payment_failed",
  "user_id": "123",
  "reason": "insufficient_funds",
  "amount": 99.99,
  "timestamp": "2025-01-24T20:00:00Z",
  "level": "error",
  "service": "billing",
  "request_id": "req_abc123"
}

必須フィールド

すべてのログイベントには、必ず次の項目を含めてください。

フィールド形式例
timestampタイムゾーン付き ISO 86012025-01-24T20:00:00Z
leveldebug、info、warn、errorinfo
eventsnake_case、過去形user_login_succeeded
request_id または trace_idUUID またはプレフィックス付き IDreq_abc123
serviceサービス/アプリ名api-gateway
environmentprod、staging、devprod

カーディナリティの高いフィールド

利用できる場合は次の項目を含めてください。インシデント発生時にログを検索しやすくなります。

カテゴリフィールド
識別情報user_id、org_id、account_id
トレーシングrequest_id、trace_id、span_id
ドメインorder_id、transaction_id、job_id

ルール: 特定のエンティティに問題を絞り込むのに役立つ、ドメイン固有の識別子を探してください。

ログレベル

レベル使用する場面例
debug詳細なローカル開発情報。本番環境では無効にします変数の値、ループの反復
info記録する価値のある通常の処理ユーザー操作、ジョブの完了、デプロイ
warn想定外だが処理済みリトライの開始、フォールバックの有効化
error失敗し、対応が必要例外、リクエストの失敗、タイムアウト

アンチパターン: 想定内の状態をエラーとして記録しないでください(パスワードの誤りは info であり、error ではありません)。

コンテキストの伝播

分散システムでは、次の点に従ってください。

  1. ID を継承する — 下流サービスには、上流から相関 ID を渡す必要があります
  2. 境界を越えて引き継ぐ — HTTP ヘッダー、メッセージキュー、非同期ジョブ
  3. ミドルウェアで注入する — ミドルウェア/インターセプターを通じて、すべてのログにコンテキストを自動的に注入します
[Client] --request_id--> [API Gateway] --request_id--> [Service A] --request_id--> [Service B]
                              |                              |                          |
                           (logs)                         (logs)                     (logs)
                              ↓                              ↓                          ↓
                     All queryable by single request_id

非同期ジョブ: バックグラウンド処理では、元のリクエストコンテキストを保存し、復元してください。

ログに記録する内容

記録する内容記録しない内容
リクエストの開始/終了と所要時間機密データ(パスワード、トークン、PII、カード情報)
状態遷移(作成 → 支払い済み → 発送済み)タイトなループ内のログ
外部サービスの呼び出しとレイテンシ+ステータスデバッグに役立つ情報のない成功ケース
認証/認可イベント重複するインフラログ(LB がすでに記録しているもの)
ジョブの開始、完了、失敗
リトライの試行、サーキットブレーカーの状態変化

命名規則

パターン例
フィールド名:snake_caseuser_id。userId や user-id は使いません
イベント:過去形の動詞payment_completed。complete_payment は使いません
役立つ場合はドメインプレフィックスを付けるauth.login_failed、billing.invoice_created

チームでの合意: フィールド名は一度定義し、すべてのサービスで一貫して使用してください。

パフォーマンス

懸念事項対策
大量に出力される debug ログ本番環境ではサンプリングする
ホットパスでのロギング避けるか、非同期アペンダーを使用する
I/O のオーバーヘッド書き込みをバッファリングしてバッチ処理する
動的な詳細度実行時に設定可能なログレベルを使用する

言語別の実装

言語ライブラリ備考
Pythonstructlogmajestic-data/etl-core-patterns を参照
Ruby/RailsRails.event (8.1+)、semantic_loggermajestic-rails/dhh-coder/structured-events を参照
Node.jsJSON フォーマッターを使用した pino、winston
Goslog (stdlib)、zerolog
JavaJSON エンコーダーを使用した logback

ログに記録するかどうかの判断表

シナリオ判断理由
ユーザーが誤ったパスワードを入力したinfo想定される動作であり、エラーではありません
決済ゲートウェイがタイムアウトしたerror + 再試行対応が必要で、ユーザーに影響します
キャッシュミスdebugパフォーマンス分析にのみ役立ちます
ユーザーがアカウントを作成したinfo記録する価値のあるビジネスイベントです
10000 回のループのうち 5000 回目の反復ログに記録しないノイズが増え、デバッグに役立ちません
外部 API が 500 を返したwarn または error再試行やフォールバックの動作によって異なります
バックグラウンドジョブが開始したinfoジョブのデバッグに役立ちます
再試行後にバックグラウンドジョブが失敗したerror調査が必要です

インシデントのデバッグチェックリスト

ログを設計する際、次の質問に答えられることを確認してください。

  • 誰 — 特定のユーザー/組織/アカウントに絞り込めますか?
  • 何 — 失敗した操作を正確に特定できますか?
  • いつ — 特定の時間帯に絞り込めますか?
  • なぜ — エラーのコンテキスト(理由、上流の原因)が記録されていますか?
  • どこ — 相関 ID を使ってサービス間を追跡できますか?

インシデント発生後: あればよかったと思うログを追加してください。

コメント