コンテンツにスキップ

ログ@テレメトリー

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. ログ

ログとは

特定の瞬間に発生したイベントが記載されたデータのこと。


構造からみた種類

▼ 非構造化ログ

構造が無く、イベントの値だけが表示されたログのこと。

192.168.0.1 [2021-01-01 12:00:00] GET /foo/1 200

▼ 構造化ログ

イベントの項目名と値の対応関係を持つログのこと。

JSON型で表すが、拡張子がjsonであるというわけでないことに注意する。

{
  "client_ip": "192.168.0.1",
  "timestamp": "2021-01-01 12:00:00",
  "method": "GET",
  "url": "/foo/1",
  "status_code": 200,
}


02. ログ収集方式

Distributed logging (分散ロギング)

マイクロサービスアーキテクチャの各サービスから収集されたログを、バラバラに分析/管理する。


Centralized logging (集中ロギング)

マイクロサービスアーキテクチャの各サービスから収集されたログを、一元的に分析/管理する。

各コンテナ (例:アプリコンテナ、サービスメッシュサイドカー) が作成するログに一意なIDを割り当て、人繋ぎに紐付ける必要がある。

例えば、ログ監視バックエンドでこのログをクエリしさえすれば、リクエストの経路がわかる。

# Cloud Loggingでログをクエリする
jsonPayload.traceId="<トレースID>"


03. ログのフィールド

一覧

▼ フロントエンド

内容
イベントの内容 タイムスタンプ、 ログメッセージ、リクエストの各ヘッダー値など
ラベル 実行環境名など

▼ バックエンド

内容
イベントの内容 タイムスタンプ、 ログステータス、ログメッセージ、エラーコード、トレースID、スパンID、親スパンID、サーバー/クライアントのIPアドレス、ユーザーエージェント、ステータスコードなど
ラベル 実行環境名、リージョン名、Cluster名、Node名、Namespace名、Pod名、マイクロサービス名、コンテナ名など

▼ インフラ

内容
イベントの内容 タイムスタンプ、OSイベント、ミドルウェアイベント、セキュリティイベントなど
ラベル 実行環境名、リージョン名、Cluster名、Node名、Namespace名、Pod名、マイクロサービス名、コンテナ名など


ログレベル

▼ FATAL

重要度が最も高いログレベルである。

重要なビジネス機能が動作しなくなったことを表す。

以下のような場合にFATALとする。

  • アプリに必要不可欠な外部依存システム(例:DB、APIなど) が動作しなくなった場合
  • サーバーのディスク容量やメモリが不足し、アプリが停止したり応答しなくなった場合
  • セキュリティ侵害や機密データへの不正アクセスを検出した場合

▼ ERROR

重要度が高いログレベルである。

重要なビジネス機能は動作しているが、その他の一部が動作しなくなったことを表す。

以下のような場合にERRORレベルとする。

  • アプリの機能に影響を与える外部依存システム (例:DB、APIなど) で障害が起こった場合
  • 接続のタイムアウトやDNS解決の失敗などのネットワーク接続で問題が起こった場合
  • アプリのCRUD処理に失敗した場合
  • JSONオブジェクトのデコードに失敗した場合

▼ WARNING

全体としてビジネス機能は動作しているが、動作しなくなる可能性があることを表す。

以下のような場合にWARNINGレベルとする。

  • リトライで回復の可能性があるエラー (例:ネットワーク接続の問題など) の場合
  • ハードウェアリソースの閾値を超えそうな場合
  • アプリの機能に影響を与える外部依存システム (例:DB、APIなど) のレスポンス速度が閾値を超えている場合
  • 推奨の設定になっていない場合
  • 脆弱性がある場合

▼ INFO

全体としてビジネス機能は動作しており、イベントが起こったことを表す。

以下のような場合にINFOレベルとする。

  • イベントの変化 (例:PENDINGイベントからIN PROGRESSイベントへの移行など) が起こった場合
  • アプリの機能に影響を与える外部依存システム (例:DB、APIなど) でイベントが起こった場合

▼ DEBUG

開発者が開発しやすくするための詳細な情報を含むイベントが起こったことを表す。

詳細な情報を持つ、アプリのパフォーマンスに影響が出るため、本番環境では無効にしておく。

  • アプリのイベントに関する詳細情報
  • 外部依存システム (例:DB、APIなど) の送信 (例:リクエスト、クエリ) と受信 (例:レスポンス、DBレコード) の詳細情報