Google Cloud Platformに戻る

Cloud Logging

Cloud Loggingとは

Cloud Loggingは、Google Cloud Platform (GCP) が提供するフルマネージドのログ管理サービスです。GCPリソース、オンプレミス環境、他のクラウドプロバイダーからのログデータを収集、保存、検索、分析、モニタリングするための統合プラットフォームを提供します。Cloud Loggingは、システムの可観測性を向上させ、問題のトラブルシューティングやセキュリティ監査、コンプライアンス要件の満たすための重要なツールです。

Cloud Loggingの主な特徴

Cloud Loggingのアーキテクチャ

Cloud Loggingは以下の主要コンポーネントで構成されています:

コンポーネント 説明
Logging API ログエントリの書き込み、読み取り、管理のためのAPI
ログルーター ログエントリを適切な宛先(ログバケット、Pub/Sub、BigQueryなど)にルーティング
ログバケット ログデータを保存するためのストレージ単位
ログビューア ログエントリを検索、フィルタリング、表示するためのインターフェース
ログベースのメトリクス ログデータから生成されるカスタムメトリクス
ログシンク ログデータを外部システム(BigQuery、Cloud Storage、Pub/Subなど)にエクスポートするための設定
Logging Agent Compute EngineやKubernetesなどの環境からログを収集するエージェント

Cloud Logging と他のログ管理サービスの違い

Cloud Loggingと他のログ管理サービスには以下のような違いがあります:

Cloud Loggingの使用方法

Cloud Loggingは、Google Cloud Console、gcloud CLIツール、クライアントライブラリ、またはRESTful APIを使用して利用できます。

ログの表示と検索

Google Cloud Consoleのログエクスプローラーを使用して、ログを表示、検索、フィルタリングできます:

基本的なログクエリの例

resource.type="gce_instance"
severity>=ERROR
timestamp>"2023-01-01T00:00:00Z"

高度なログクエリの例

resource.type="k8s_container"
resource.labels.namespace_name="production"
resource.labels.container_name="web-server"
textPayload:"Exception"
timestamp>="2023-01-15T00:00:00Z"
timestamp<="2023-01-16T00:00:00Z"

gcloud CLIを使用したログの表示

基本的なログ読み取りコマンド

gcloud logging read "resource.type=gce_instance AND severity>=ERROR" \
  --limit=10 \
  --format=json

時間範囲を指定したログの読み取り

gcloud logging read "timestamp>=\"2023-01-15T00:00:00Z\" AND timestamp<=\"2023-01-16T00:00:00Z\"" \
  --limit=50 \
  --order=asc

アプリケーションからのログ出力

アプリケーションからCloud Loggingにログを出力するには、各言語用のクライアントライブラリを使用します:

Node.jsでのログ出力例

const {Logging} = require('@google-cloud/logging');
const logging = new Logging();
const log = logging.log('my-log');

async function writeLog() {
  const text = 'Hello, Cloud Logging!';
  const metadata = {
    resource: {
      type: 'global',
    },
    severity: 'INFO',
  };
  
  const entry = log.entry(metadata, text);
  await log.write(entry);
  console.log(`Logged: ${text}`);
}

writeLog();

Pythonでのログ出力例

import google.cloud.logging
from google.cloud.logging.resource import Resource

client = google.cloud.logging.Client()
logger = client.logger('my-log')

# 構造化ログの出力
logger.log_struct(
    {
        'message': 'Hello, Cloud Logging!',
        'user': 'user123',
        'event': 'login'
    },
    resource=Resource(
        type='global',
        labels={}
    ),
    severity='INFO'
)

Javaでのログ出力例

import com.google.cloud.logging.LogEntry;
import com.google.cloud.logging.Logging;
import com.google.cloud.logging.LoggingOptions;
import com.google.cloud.logging.Payload.StringPayload;
import com.google.cloud.logging.Severity;

public class LoggingExample {
  public static void main(String[] args) {
    LoggingOptions options = LoggingOptions.getDefaultInstance();
    
    try (Logging logging = options.getService()) {
      LogEntry entry = LogEntry.newBuilder(StringPayload.of("Hello, Cloud Logging!"))
          .setSeverity(Severity.INFO)
          .setLogName("my-log")
          .build();
      
      logging.write(Collections.singleton(entry));
      System.out.println("Logged: Hello, Cloud Logging!");
    } catch (Exception e) {
      System.err.println("Error writing logs: " + e.getMessage());
    }
  }
}

ログシンクの設定

ログデータを長期保存や詳細分析のために外部システムにエクスポートするためのログシンクを設定できます:

Cloud Storageへのログエクスポート

gcloud logging sinks create storage-sink \
  storage.googleapis.com/my-logs-bucket \
  --log-filter="resource.type=gce_instance AND severity>=WARNING"

BigQueryへのログエクスポート

gcloud logging sinks create bigquery-sink \
  bigquery.googleapis.com/projects/my-project/datasets/logs_dataset \
  --log-filter="resource.type=k8s_container"

Pub/Subへのログエクスポート

gcloud logging sinks create pubsub-sink \
  pubsub.googleapis.com/projects/my-project/topics/logs-topic \
  --log-filter="severity=ERROR OR severity=CRITICAL"

ログの種類と構造

Cloud Loggingでは、様々な種類のログが収集されます:

主なログの種類

ログエントリの構造

ログエントリは以下の主要フィールドで構成されています:

ログエントリのJSON表現例

{
  "insertId": "s3f7d83jd93h",
  "logName": "projects/my-project/logs/my-log",
  "resource": {
    "type": "gce_instance",
    "labels": {
      "instance_id": "1234567890123456789",
      "zone": "us-central1-a"
    }
  },
  "timestamp": "2023-01-15T12:34:56.789Z",
  "severity": "ERROR",
  "textPayload": "Application failed to start: database connection error",
  "labels": {
    "environment": "production",
    "service": "api-server"
  },
  "trace": "projects/my-project/traces/1234567890abcdef"
}

ログベースのメトリクス

ログデータからカスタムメトリクスを作成して、モニタリングとアラートに活用できます:

ログベースのカウンターメトリクスの作成

gcloud logging metrics create error-count \
  --description="Count of error log entries" \
  --filter="severity>=ERROR" \
  --metric-descriptor-type=counter

ログベースの分布メトリクスの作成

gcloud logging metrics create response-time-distribution \
  --description="Distribution of API response times" \
  --filter="resource.type=gae_app AND jsonPayload.responseTime>0" \
  --metric-descriptor-type=distribution \
  --value-extractor="EXTRACT(jsonPayload.responseTime)"

ログベースのアラート

特定のログパターンに基づいてアラートを設定できます:

ログベースのアラートポリシーの作成

gcloud alpha monitoring policies create \
  --display-name="Critical Error Alert" \
  --condition-filter="metric.type=\"logging.googleapis.com/log_entry_count\" AND resource.type=\"global\" AND metric.labels.severity=\"CRITICAL\"" \
  --condition-threshold-value=1 \
  --condition-threshold-duration=60s \
  --notification-channels="projects/my-project/notificationChannels/1234567890"

Cloud Loggingのセキュリティ

Cloud Loggingでは、ログデータのセキュリティを確保するための様々な機能が提供されています:

アクセス制御

IAMを使用して、ログデータへのアクセスを制御できます:

# ログ閲覧者ロールの付与
gcloud projects add-iam-policy-binding my-project \
  --member=user:user@example.com \
  --role=roles/logging.viewer

# ログ書き込み者ロールの付与
gcloud projects add-iam-policy-binding my-project \
  --member=serviceAccount:my-service-account@my-project.iam.gserviceaccount.com \
  --role=roles/logging.logWriter

ログの暗号化

Cloud Loggingのデータは、保存時と転送時に自動的に暗号化されます。さらに、カスタマー管理の暗号化キー(CMEK)を使用することもできます:

# CMEKを使用したログバケットの作成
gcloud logging buckets create my-cmek-bucket \
  --location=global \
  --cmek-kms-key-name=projects/my-project/locations/global/keyRings/my-keyring/cryptoKeys/my-key

データアクセス監査ログ

データアクセス監査ログを有効にして、機密データへのアクセスを監視できます:

gcloud logging settings update \
  --organization=ORGANIZATION_ID \
  --enable-data-access

Cloud Loggingのベストプラクティス

Cloud Loggingを効果的に活用するためのベストプラクティス:

ログ設計のベストプラクティス

運用のベストプラクティス

コスト最適化のヒント

Cloud Loggingのユースケース

Cloud Loggingは以下のようなユースケースに適しています:

ユースケース例:アプリケーションのトラブルシューティング

エラーログの検索と分析

# エラーログの検索
gcloud logging read "resource.type=gae_app AND severity>=ERROR" \
  --limit=10 \
  --format=json

# 特定のエラーパターンの検索
gcloud logging read "resource.type=gae_app AND textPayload:\"database connection failed\"" \
  --limit=10 \
  --format=json

# エラー発生前後のログの検索
gcloud logging read "resource.type=gae_app AND resource.labels.module_id=\"api-server\"" \
  --limit=50 \
  --order=asc \
  --freshness=1d

Cloud Loggingとの統合サービス

Cloud Loggingは他のGoogle Cloudサービスと統合して、より強力なソリューションを構築できます:

サービス 統合の利点
Cloud Monitoring ログとメトリクスを組み合わせた総合的なモニタリング
Cloud Trace 分散トレーシングとログの関連付けによる詳細な問題診断
Error Reporting アプリケーションエラーの自動検出と集約
BigQuery ログデータの高度な分析とクエリ
Pub/Sub ログイベントに基づいたリアルタイム処理
Cloud Storage ログデータの長期保存とアーカイブ
Cloud Security Command Center セキュリティ関連のログの集約と分析

Pub/Subとの統合例

ログをPub/Subにエクスポートする

# Pub/Subトピックの作成
gcloud pubsub topics create log-events

# ログシンクの作成
gcloud logging sinks create pubsub-sink \
  pubsub.googleapis.com/projects/my-project/topics/log-events \
  --log-filter="severity>=WARNING"

# サービスアカウントに発行者権限を付与
gcloud pubsub topics add-iam-policy-binding log-events \
  --member=serviceAccount:$(gcloud logging sinks describe pubsub-sink --format="value(writerIdentity)") \
  --role=roles/pubsub.publisher

まとめ

Cloud Logging は、Google Cloud Platform上でのログ管理サービスとして、様々なソースからのログデータを収集、保存、検索、分析、モニタリングするための統合プラットフォームを提供します。システムの可観測性を向上させ、問題のトラブルシューティングやセキュリティ監査、コンプライアンス要件を満たすための重要なツールです。

Cloud Loggingの主な利点は以下の通りです:

Cloud Loggingを効果的に活用するには、構造化ログの使用、適切なログレベルの設定、コンテキスト情報の追加、効率的なログフィルタの作成、ログシンクの活用などのベストプラクティスを適用することが重要です。また、コスト最適化のために、不要なログの除外、サンプリングの活用、適切な保持期間の設定なども検討すべきです。