開発運用アーキテクチャ

ログ設計 ― 構造化JSON+PII禁止+段階的コールド化 ― 生成AI時代のアーキテクチャ超入門

ログ設計 ― 構造化JSON+PII禁止+段階的コールド化 ― 生成AI時代のアーキテクチャ超入門

本記事について

当サイトを閲覧いただきありがとうございます。 本記事はシリーズ『生成AI時代のアーキテクチャ超入門』の「開発運用アーキテクチャ」カテゴリ第10弾として、ログ設計について解説する記事です。

ログは書いたその時ではなく、半年後に真価が問われる将来の自分への手紙です。本記事では構造化ログ(JSON)・ログレベル・相関ID・PII マスキング・保存期間・ログ集約基盤(CloudWatch/Loki/Datadog)まで、必要十分な情報を機械が読める形で適切な保存期間で残す設計を扱います。

このカテゴリの他の記事

概要 ― 作って届けて動かし続ける一本の流れ ― 生成AI時代のアーキテクチャ超入門senkohome.com/arch-intro-devops-overview/DevOps・SREの全体像 ― 速度と安定性は両立する ― 生成AI時代のアーキテクチャ超入門senkohome.com/arch-intro-devops-sre/構成管理 ― Git+モノレポ+GitHub Flowが鉄板 ― 生成AI時代のアーキテクチャ超入門senkohome.com/arch-intro-devops-vcs/開発環境とローカル実行 ― 初コミットまで半日 ― 生成AI時代のアーキテクチャ超入門senkohome.com/arch-intro-devops-devenv/コードレビュー ― PR 300行+1人承認+CODEOWNERS ― 生成AI時代のアーキテクチャ超入門senkohome.com/arch-intro-devops-review/テスト設計 ― ピラミッド+Testcontainers+ブランチカバレッジ ― 生成AI時代のアーキテクチャ超入門senkohome.com/arch-intro-devops-test/CI/CD ― GitHub Actions+OIDC+Feature Flagが鉄板 ― 生成AI時代のアーキテクチャ超入門senkohome.com/arch-intro-devops-cicd/デプロイ戦略 ― 頻度を上げてリスクを下げる ― 生成AI時代のアーキテクチャ超入門senkohome.com/arch-intro-devops-deploy/監視とオブザーバビリティ ― 三本柱+OpenTelemetry+SLOアラート ― 生成AI時代のアーキテクチャ超入門senkohome.com/arch-intro-devops-observability/SLOとSLI ― 100%を求めずエラー予算で速度を買う ― 生成AI時代のアーキテクチャ超入門senkohome.com/arch-intro-devops-slo/インシデント対応 ― 英雄ではなく仕組みで収束させる ― 生成AI時代のアーキテクチャ超入門senkohome.com/arch-intro-devops-incident/SREプラクティス ― Toil削減とカオス演習 ― 生成AI時代のアーキテクチャ超入門senkohome.com/arch-intro-devops-sre-practice/ドキュメンテーション ― README+ADR+OpenAPIをGitに寄せる ― 生成AI時代のアーキテクチャ超入門senkohome.com/arch-intro-devops-docs/チケット・プロジェクト管理 ― Epic/Story/Task+1日粒度 ― 生成AI時代のアーキテクチャ超入門senkohome.com/arch-intro-devops-ticket/

なぜログ設計が必要か

障害調査の一次情報

障害が起きた時、ログがなければ原因はわかりません。ログは過去のシステム状態を復元する唯一の資産です。

監査・コンプライアンス対応

「誰がいつ何をしたか」の記録は、監査で必ず求められます。SOX・PCI DSS・個人情報保護法──全て監査ログの保存を要求します。

ビジネス分析・改善

ユーザー行動・エラー傾向・パフォーマンス──ログを分析すればプロダクト改善のヒントが得られます。メトリクスより詳細な情報が取れます。

ログレベル

ログの重要度を段階分けするのが標準です。運用時にレベルで絞り込め、本番では INFO 以上、開発では DEBUG 以上、といった制御ができます。各言語のログライブラリは標準で対応しています。

レベル用途
TRACE最も詳細・通常は無効
DEBUG開発時のデバッグ情報
INFO正常な処理の節目
WARN注意すべき状況(自動回復等)
ERRORエラー発生・要調査
FATAL致命的障害・即対応

DEBUGを本番で出すのは地獄の始まりです。量が爆発し、ストレージ費用が数倍に膨らみます。

構造化ログ(Structured Logging)

JSON 形式など、機械が読める構造でログを出力する方式です。従来のフリーテキストログは人間には読みやすいですが、検索・集計・相関分析が困難でした。構造化ログなら全てが容易になります。

{
  "timestamp": "2026-04-18T10:23:45Z",
  "level": "ERROR",
  "service": "order-api",
  "trace_id": "abc123",
  "user_id": "u42",
  "message": "Payment failed",
  "error_code": "CARD_DECLINED",
  "latency_ms": 1234
}

フリーテキスト出力は現代ではアンチパターンです。全ての新規プロジェクトは構造化ログで始めるべきです。

「エラー発生」としか書かないログは、「誰かが死んだ」としか書かれていない遺書と同じ、というのはログ設計の定番の格言です。深夜帯の障害対応で [ERROR] Payment failed だけが並ぶログを前に、どのユーザーの何円の決済がなぜ失敗したのかを「時刻」「Stripe 管理画面の突き合わせ」だけで逆引きする、という事態は現場でよく起こります。3時間格闘してようやく原因に辿り着き、その夜のうちに user_idamounterror_code を追加した、という話も珍しくありません。

何をログに書くか

ログに含める情報は標準化して、全サービスで統一します。標準項目を決めておかないと、サービスごとにバラバラになり、横断検索が困難になります。

必須項目内容
timestampISO 8601・UTC 推奨
levelERROR/INFO 等
serviceサービス名
trace_id分散トレーシングと連携
user_id/request_id主体・リクエスト識別
message人間が読む内容
context構造化された付加情報

個人情報・パスワード・トークンは絶対にログに書かないのが鉄則です。一度出力されたら回収不能です。

ログ収集アーキテクチャ

ログはアプリで出力するだけでなく、集約・保存・検索する基盤が必要です。現代はアプリは標準出力、収集は別プロセスの構成が主流(12-Factor App=Heroku が提唱したクラウド時代のアプリケーションアーキテクチャ指針)で、これによりアプリ側はログ出力先を意識しなくて済みます。

flowchart LR
    APP1[アプリ A] -->|stdout| COL[Collector<br/>Fluent Bit / Vector]
    APP2[アプリ B] -->|stdout| COL
    APP3[アプリ C] -->|stdout| COL
    COL --> BUF[(バッファ<br/>Kafka等)]
    BUF --> BACKEND[(保存先<br/>Loki / Elasticsearch / Datadog)]
    BACKEND --> UI[検索/可視化UI<br/>Grafana / Kibana]
    classDef app fill:#fef3c7,stroke:#d97706;
    classDef col fill:#dbeafe,stroke:#2563eb;
    classDef buf fill:#fae8ff,stroke:#a21caf;
    classDef store fill:#dcfce7,stroke:#16a34a;
    classDef ui fill:#f0f9ff,stroke:#0369a1;
    class APP1,APP2,APP3 app;
    class COL col;
    class BUF buf;
    class BACKEND store;
    class UI ui;
収集ツール特徴
Fluent Bit軽量・CNCF 卒業
VectorRust 製・高性能
Fluentd古参・機能豊富
PromtailLoki 専用・軽量

保存先(ログバックエンド)

ログの保存先は、検索要求・コスト・データ量で選びます。大量ログを高速検索するのは意外とコストが高く、「とりあえず全ログをElasticsearch」は破綻しやすいアプローチです。

バックエンド特徴コスト
Elasticsearch検索最強・運用重い
Lokiラベルベース・安価
Datadog LogsSaaS 統合
Splunk老舗・高機能最高
Cloud Logging(GCP)マネージド
CloudWatch LogsAWS 統合
S3/GCSアーカイブ最低

LokiGrafana Labs 製でコスト効率が極めて良く、近年急速に普及しています。Elasticsearch の代替として注目されています。

保持期間とコスト管理

ログは保持期間に比例してコストが増えるため、永久保存は現実的ではありません。法的要件・調査要件を考慮して、段階的なコールド化が一般的です。

段階期間用途
ホット(高速検索)7〜30日障害調査
ウォーム(やや遅い)3〜6か月分析・監査
コールド(アーカイブ)1〜7年監査要件・法的保管
削除それ以降不要情報は消す

監査ログは7年保存が多くの規制で要求されますが、アプリログは30日で十分なことも多いです。分類して扱うのが現実的です。

ログのサンプリング

大規模システムでは全ログを保存するとコストが爆発するため、サンプリングで削減します。ただしエラーログは100%保存するのが原則で、成功リクエストだけサンプリングします。

戦略内容
固定レート1/100 だけ保存
テールサンプリングエラー時は全保存
重要度ベース金額・ユーザー種別で変える
適応サンプリングトラフィック量で自動調整

OpenTelemetry のテールサンプリングが現代的な解で、トレース全体を見てから保存判断できます。

監査ログ(Audit Log)

「誰がいつ何をしたか」を記録する特別なログで、改ざん不可・長期保存が要求されます。一般ログとは別経路で管理し、WORM(Write Once Read Many)ストレージに保存するのが理想です。

必須記録項目内容
Who(誰が)ユーザーID・IP
What(何を)操作内容
When(いつ)タイムスタンプ
Where(どこで)システム・リソース
Result成功/失敗

AWS CloudTrail・GCP Audit Logs はクラウドレベルの監査ログを標準提供します。アプリレベルの監査ログは、別テーブルや別ログストリームに分離するのが安全です。

PII(個人情報)の取り扱い

個人情報をログに出力しないのが原則です。GDPR・個人情報保護法で厳しく規制されており、「ログから漏れた」では言い訳になりません。

対処内容
マスキングuser***@gmail.com のように伏せ字
ハッシュ化分析用に一方向変換
除外そもそも出力しない
PII 検出ツール自動検出してブロック

クレカ番号・マイナンバー・パスワード・APIキー──これらは絶対にログに出ないよう、フレームワーク・ログライブラリで対策します。

判断基準①:データ量

ログ量でバックエンド選択が変わります。月に数GBなら CloudWatch Logs、数TBなら Loki・Elasticsearch、それ以上なら Splunk 等の本格派が必要です。

月間ログ量推奨
〜10GBCloudWatch Logs/Datadog 無料枠
10GB〜1TBLoki/Grafana Cloud
1TB〜10TBElasticsearch 自社運用/Datadog
10TB〜Splunk/Elastic Cloud エンタープライズ

判断基準②:組織の規制要件

監査・コンプライアンス要件が厳しい業種は、ログの改ざん不可・長期保存が必須です。

業種・規制必須要件
金融・PCI DSS1年以上・改ざん防止
医療・HIPAA6年保存・暗号化
J-SOX会計関連は7年
一般企業30〜90日 + 監査ログは長期

ケース別の選び方

個人開発・小規模Webサービス

CloudWatch Logs or Cloud Logging + 構造化ログ出力。追加基盤なしで始められます。30日保持で十分で、監査ログだけ S3 に転送して長期保管します。

スタートアップ・SaaS(月間数十GB)

Grafana Cloud(Loki)+ OpenTelemetry Logs。コスト効率が良く、同じ基盤でメトリクス・トレースも扱えます。PII は pre-commit hook + Fluent Bit フィルタで多層防御します。

中堅企業・マイクロサービス

Loki 自社運用 + Vector or Fluent Bit + S3 アーカイブ。Loki でホット検索、S3 に長期アーカイブ、監査ログは CloudTrail と別経路で分離します。SRE 2〜3名で運用可能です。

金融・医療・規制業種

Splunk or Elastic Cloud + WORM ストレージ + 改ざん防止。監査ログは別系統・別権限・長期保存(7年)とし、全ログに署名・チェーン化(Hash Chain)して改ざん検知可能にします。

よくある勘違い

全部INFOレベルで出力しておけば安全

量が爆発してコストも検索も破綻します。レベル設計が先です。

開発中のprintを本番に残しても大丈夫

個人情報が混入する典型パターンです。pre-commit で print 検出するのが安全です。

ログは永遠に保存したい

現実的ではありません。コスト試算すると1年保存で数千万になることもあり、段階的コールド化が必須です。

stdoutに出すだけで十分

アプリとしては正しい判断です。ただし収集基盤が別途必要で、12-Factor App に従います。

ログ量・保存期間の数値Gate

※ 2026年4月時点の業界相場値です。テクノロジー・人材市場の変化で陳腐化するため、定期的にアップデートが必要です。

ログは「全部取る」と請求書が爆発するので、用途別の保存戦略が必須です。

項目推奨値理由
本番ログレベルINFO以上DEBUG は禁止(量が10倍)
ホット保存期間7〜30日障害調査の即応性
ウォーム保存期間3〜6か月分析・監査
コールド保存期間(監査)1〜7年規制対応(金融: 7年、PCI DSS: 1年)
1リクエストあたりのログ量1KB以下肥大化防止
エラーログ保存100%(サンプリング禁止)全て残す
成功ログ保存1〜10%サンプリングコスト削減
ログ形式構造化JSONAI・機械可読
必須フィールドtimestamp/level/service/trace_id横断検索
PII(個人情報)出力絶対禁止マスキング必須

月間ログ量の目安は、〜10GBはCloudWatch無料〜数千円、〜1TBはLokiで数万円、〜10TBはElasticsearch自社運用で月数十万円、それ以上はSplunkエンタープライズで数百万円〜。月1TB超になったらLoki/Grafana Cloudへの移行を検討すべきラインです。

ログは「取る」より戻せる形で残す。段階的コールド化とサンプリングで費用を制御します。

ログ運用の鬼門・禁じ手

ログで事故る典型パターン。どれも情報漏洩・コスト爆発・調査不能のいずれかにつながります。

禁じ手なぜダメか
PII(個人情報・パスワード・APIキー)をログ出力2018年 GitHub 平文パスワード事件、470万件強制リセット発生
フリーテキストログ検索・集計・AI 解析が困難。構造化JSON必須
trace_idなしでマイクロサービス運用横断検索不能、障害調査が数時間〜数日に
全てをINFO以上で出す本番でDEBUG残しは月100万円請求の定番
単一サービスだけ独自形式のログ横断検索で詰まる。チーム内で標準を統一
ログをアプリと同じストレージに保存侵害時にログごと消される。別アカウント + WORM
永久保存を目指す年間数千万円のストレージ課金。段階的コールド化
エラーログのサンプリングエラーは100%保存が鉄則。失敗は全て残す
HTTPボディを丸ごとログ出力2021年 Twitter 内部ログAPIキー混入事件のパターン
pre-commit hookなしでprint文を残す個人情報が混入する典型。GitLeaks/detect-secretsで防ぐ
監査ログと一般ログを混在監査対応不能。別ログストリームで分離

2018年の GitHubパスワード平文ログ事件(パスワードリセット機能の実装ミスで一部ユーザーの平文パスワードが内部ログに記録、約470万件の強制リセット)、2021年の Twitter内部ログAPI Key混入事件HTTPボディ丸ごとログ出力で認証トークンが6か月分の監査ログに残留)──ログに何を出すかの設計漏れが情報漏洩に直結する事例です。

PII・トークン・パスワードの出力禁止は実装レベルで強制。運用ルールだけでは守れません。

AI時代の視点

AI 駆動開発(バイブコーディング)と AI 活用が前提になると、ログはAIが読んで診断する教材として再定義されます。Datadog Bits AI・Grafana LLM 等の AI アシスタントは、ログを解析して障害の原因を自然言語で説明してくれます。

AI時代に有利AI時代に不利
構造化ログ(JSON)フリーテキスト
標準スキーマ(OTel Logs)独自フォーマット
trace_id で相関孤立したログ
意味のあるメッセージ「エラー発生」だけ

AI が「このエラーの原因は○○で、△△を直せばいい」と答えてくれる時代が始まっています。前提は AI が理解できる構造で出力することで、メッセージには何が・なぜ失敗したかを明示するのが新しい基準です。

ログはAIへのメッセージ。機械が読んで診断できる形で残します。

筆者メモ — 「ログに全部書いていた」が情報漏洩に変わった事例

「とりあえず全部ログに出しておく」が事故に繋がった事例は、業界の定番の教訓です。

2018年の GitHubパスワード平文ログ事件では、パスワードリセット機能の実装ミスにより、一部ユーザーの平文パスワードが内部ログに記録されていたことが判明しました。幸い外部流出は起きませんでしたが、内部調査のために約470万件のパスワード強制リセットが行われ、「ログは安全な場所」という前提が崩れた事例として語り草になっています。

もう一つ、2021年には Twitter 内部ログにAPIキー混入が報告されています。開発者が HTTP ボディを丸ごとログに出していた結果、認証トークンが6か月分の監査ログに記録された、というケースで、ログの閲覧権限を持つ社員全員が事実上そのトークンを知れる状態になっていました。ログを読める=本番データを読めるという構造的な問題を浮き彫りにした事例です。

どちらも「何を出すか・何を出さないか」の設計が甘かった事例で、PII・トークン・パスワードをログに出さない規律は、運用ルールではなく実装レベルで強制する必要があります。

決めるべきこと — あなたのプロジェクトでの答えは?

以下の項目について、あなたのプロジェクトの答えを1〜2文で言語化してみてください。曖昧なまま着手すると、必ず後から「なぜそう決めたんだっけ」が問われます。

  • ログフォーマット(JSON構造化推奨)
  • ログレベル戦略(本番INFO/開発DEBUG)
  • 必須項目の標準化(timestamp・trace_id・service)
  • 収集基盤(Fluent Bit/Vector/各クラウド)
  • 保存先(Loki/Elasticsearch/Datadog)
  • 保持期間(ホット/ウォーム/コールド)
  • PII対策(マスキング・検出)

最終的な判断の仕方

ログ設計の核心は半年後の自分への手紙であり、書いた直後ではなく将来の障害調査で真価が問われます。構造化ログ(JSON)を標準にし、trace_id/service/user_id といった標準項目を統一して横断検索できる状態を作るのが合理的な判断です。フリーテキストログはもはやアンチパターンで、PII(個人情報)を絶対出さない規律と、段階的コールド化でコストを抑える運用が必須になります。エラーは100%保存し、成功はサンプリングするのが、大規模で破綻しない定石です。

もう一つの決定的な軸はログはAIへのメッセージです。Datadog Bits AI や Grafana LLM のような AI アシスタントがログを読んで障害原因を自然言語で説明する時代、構造化・標準スキーマ・trace_id 相関が揃っていれば数秒で原因仮説が立ちます。逆にフリーテキスト・独自フォーマットは、AI も人間も読めない負債になります。

選定の優先順位

  1. 構造化ログをデフォルト — JSON・標準項目・意味のあるメッセージ
  2. PII出力を絶対禁止 — マスキング・検出・pre-commit、一度出したら回収不能
  3. 段階的コールド化 — ホット30日/ウォーム3〜6か月/コールド1〜7年
  4. trace_idで相関 — メトリクス・トレースと紐付け、AI診断の基盤に

ログはAIへのメッセージ構造化・標準・相関で、半年後に真価が出る形で残します。

まとめ

本記事はログ設計について、ログレベル・構造化ログ・必須項目・収集と保存先・保持期間・サンプリング・PII保護・AIへのメッセージ視点まで含めて解説しました。如何だったでしょうか。

構造化ログをデフォルトに、PII出力を絶対禁止、段階的コールド化、trace_idで相関する。これが2026年のログ設計の現実解です。

次回はSLOSLI(信頼性目標とエラーバジェット)について解説します。

シリーズ目次に戻る → 『生成AI時代のアーキテクチャ超入門』の歩き方

それでは次の記事も閲覧いただけると幸いです。