ログ収集の仕組み — 「注文できなかった」を記録からたどる
同じIDで追い、記録を調査につなげる
- 身近な例で仕組みを説明できる
- 例の入力と結果を比べ、成立条件を確認する
まずは、同じ注文の2件を見つける
次は架空の注文サービスの練習用ログです。1行に1つのJSONを置き、orders-demo.jsonlとしてUTF-8で保存してください。時刻末尾のZはUTCを表しています。
{"time":"2026-10-09T10:00:00Z","level":"INFO","request_id":"req-demo","event":"order_started"}
{"time":"2026-10-09T10:00:01Z","level":"INFO","request_id":"req-other","event":"order_completed"}
{"time":"2026-10-09T10:00:02Z","level":"ERROR","request_id":"req-demo","event":"stock_unavailable"}
req-demoだけを読むと、注文開始のあと、在庫を用意できなかったという記録が見つかります。間に別のリクエストの成功があるので、時刻の順だけで一続きの注文だと判断しないことがポイントです。
Python 3が使える場合は、同じフォルダーにfind-order.pyを保存し、そのフォルダーでpython find-order.pyを実行してみましょう。環境によってはpython3を使います。
import json
from pathlib import Path
log_file = Path(__file__).with_name(
'orders-demo.jsonl'
)
text = log_file.read_text(encoding='utf-8')
for line in text.splitlines():
event = json.loads(line)
if event['request_id'] == 'req-demo':
print(
event['level'], event['event']
)
結果は次の2行です。IDをreq-otherに変えると、別の注文の成功だけが出ます。
INFO order_started
ERROR stock_unavailable
これは練習用の固定データで、実際の注文システムではありません。stock_unavailableがなぜ起きたかは、在庫や通信の状態など追加の調査が必要です。ログに書かれた失敗理由と、根本原因は区別しましょう。
集める仕組みは「記録 → 収集 → 保存 → 検索」
- アプリが、必要な出来事を記録します。
- 収集する係が、その出力を読み取ります。
- 保存先へ送り、必要な期間保管します。
- 調べたい時刻・サービス・IDで検索します。
小さなアプリではまずファイルを読むだけでも始められます。複数台になったら収集ツールやマネージドサービスを検討します。キューやバッファーを必ず別サービスとして挟むわけではありません。送信に失敗したときの再試行、重複、欠落と、収集側の健康状態も確認してください。
何を入れるか、何を入れないか
| 項目 | 役立つ場面 |
|---|---|
| 時刻とタイムゾーン | 前後関係や他サービスとの照合 |
| レベル・出来事の名前 | 失敗や特定の処理の検索 |
| サービス名 | どのアプリの記録かの区別 |
| リクエストID | 同じ処理の関連記録を追う |
パスワード、アクセストークン、秘密鍵、接続文字列などをそのまま記録しないようにします。個人情報も調査目的に必要な範囲を確認し、除去やマスキングなどを検討します。JSONは文字列を手で連結せず、ライブラリーで正しくエンコードしてください。入力の改行などが、別のログ行として解釈される問題にも注意します。
Pythonの標準loggingと他の道具ではレベル名が違う場合があります。DEBUGだから必ず開発だけ、INFOだから何を出してもよい、という決め方はせず、調査目的と量、機密性で出力を設計します。
もう少し詳しく:メトリクス・トレース・保管
メトリクスは件数や応答時間などの数値、トレースは処理がサービス間を通った経路を調べる手段です。OpenTelemetryのログモデルではTraceIdなどを使って関連付けできます。ただし、練習用のreq-demoは単なる独自IDで、W3CのTraceId形式ではありません。
リクエストごとのIDを、Prometheusのメトリクスのラベルへ無制限に入れると、時系列が増えすぎます。ログで探すIDと、メトリクスで集計する分類は同じ設計にしないようにしましょう。
ログローテーションは、サイズや日付でファイルを切り替える仕組みです。別の保管先へアーカイブすることや、何年残すかという保持方針とは分けて考えます。ログの閲覧権限や通信経路、改ざんへの対策も、記録の用途に合わせて決めてください。
覚え方と次の一歩
「ログ」って出てきたら「あとから出来事をたどるための記録」と思えばだいたいOK!
まず同じIDの記録を探し、その次にPrometheus入門で数値の観測、ログの用語解説で基本を整理できます。
参考資料
- Python:Logging HOWTO — 標準loggingのレベルと出力の設定
- Python:json — JSONの読み取りとエンコード
- OpenTelemetry:Logs Data Model — ログの項目とTraceId・SpanIdによる関連付け
- OWASP:Logging Cheat Sheet — 機密情報の除外、エンコード、収集・保管・アクセス制御
- Prometheus:Metric and label naming — 高カーディナリティーのラベルを避ける理由