エクスポートしたログを使用する

このページでは、エクスポートしたログエントリをCloud StorageBigQueryPub/Sub で検索して使用する方法について説明します。

Stackdriver Logging を使用するログのエクスポートのコンセプトの概要については、ログのエクスポートの概要をご覧ください。

Logging を使用してログをエクスポートする方法については、次のページをご覧ください。

Cloud Storage

エクスポートしたログを Cloud Storage で表示する方法は次のとおりです。

  1. Cloud Console の Cloud Storage ブラウザに移動してください。

    Cloud Storage ブラウザに移動

  2. ログのエクスポートに使用するバケットを選択します。

ログをバケットで整理する方法の詳細については、このページのCloud Storage の構成をご覧ください。

エクスポートしたログの可用性

エクスポートされたログがない場合は、エクスポート システムの指標を確認します。エクスポート システムの指標では、エクスポートされたログエントリの数と、エラーによってドロップされたログエントリの数がわかります。エクスポート システムの指標にログエントリがエクスポートされていないことが示されている場合は、エクスポート クエリで、クエリに一致するログエントリが最近 Logging に到着していることを確認します。

[ログのエクスポート] に移動

Cloud Storage バケットへのログエントリの保存は 1 時間ごとに一括して行われます。最初のエントリが表示されるまでに 2~3 時間かかることがあります。

エクスポートしたログの構成

Cloud Storage バケットにログをエクスポートすると、Logging は一連のファイルをバケットに書き込みます。ファイルは、ログタイプと日時別にディレクトリ構造で構成されます。LogEntry[LOG_ID] として参照されるログタイプは、syslog のようなシンプルな名前にも、appengine.googleapis.com/request_log のような複雑な名前にもできます。これらのログが my-gcs-bucket という名前のバケットに保存された場合は、次の例のようにディレクトリに名前が付けられます。

my-gcs-bucket/syslog/YYYY/MM/DD/
my-gcs-bucket/appengine.googleapis.com/request_log/YYYY/MM/DD/

1 つのバケットに複数のリソースタイプのログを含めることができます。

Logging は、同一または重複するクエリを含むシンクからのログエントリの重複除去を保証しません。これらのシンクからのログエントリが複数回 Cloud Storage バケットに書き込まれることがあります。

リーフ ディレクトリ(DD/)には複数のファイルが含まれます。それぞれのファイルはエクスポートしたログエントリをファイル名で指定された期間保持します。ファイルはシャーディングされ、ファイル名の末尾にシャード番号 Sn またはAnn=0、1、2、...)が付きます。たとえば、次の 2 つのファイルがディレクトリmy-gcs-bucket/syslog/2015/01/13/に格納されます。

08:00:00_08:59:59_S0.json
08:00:00_08:59:59_S1.json

0800 UTC から 1 時間のすべてのインスタンスの syslog ログエントリが、これらの 2 つのファイルで合わせて含まれています。ログエントリのタイムスタンプは UTC (協定世界時)で表されます。

すべてのログエントリを取得するには、それぞれの期間のシャードをすべて読み取る必要があります。この例の場合はファイル シャード 0 と 1 です。書き込まれるファイル シャードの数は、ログエントリの量に応じて期間ごとに変わります。

個々のシャード ファイル内には、ログエントリが LogEntry オブジェクトのリストとして保存されます。syslog エントリの例については、このページの LogEntry タイプをご覧ください。

ファイル内のログエントリの並べ替え順は一定ではなく、保証されないことに注意してください。

クエリ

Cloud Storage へのログのエクスポートの例については、サンプルクエリをご覧ください。

BigQuery

BigQuery でエクスポートしたログを表示する方法は次のとおりです。

  1. Cloud Console で BigQuery UI に移動します。

    BigQuery に移動

  2. シンクのエクスポート先として使用するデータセットを選択します。

  3. データセットのいずれかのテーブルを選択します。[詳細] タブにログエントリが表示されます。また、テーブルに対するクエリを行ってデータを返すこともできます。

テーブルの整理方法については、テーブル構成をご覧ください。エクスポートされたログエントリ フィールドの命名方法については、ログのエクスポートと BigQuery スキーマをご覧ください。

エクスポートしたログの可用性

エクスポートされたログがない場合は、エクスポート システムの指標を確認します。エクスポート システムの指標では、エクスポートされたログエントリの数と、エラーによってドロップされたログエントリの数がわかります。エクスポート システムの指標にログエントリがエクスポートされていないことが示されている場合は、エクスポート クエリで、クエリに一致するログエントリが最近 Logging に到着していることを確認します。

[ログのエクスポート] に移動

Logging がログエントリを BigQuery にエクスポートしているときに新しいテーブルを作成した場合、新しいテーブルに最初のログエントリが表示されるまで数分かかることがあります。その後のログエントリは通常 1 分以内に表示されます。詳しくは、下記のテーブルの構成をご覧ください。

テーブルの構成

BigQuery データセットにログをエクスポートすると、Logging はエクスポートされたログエントリを保持する日付別テーブルを作成します。ログエントリは、エントリのログ名とタイムスタンプに基づく名前のテーブルに格納されます 1。次の表は、ログ名とタイムスタンプをテーブル名にマップする例を示しています。

ログ名 ログエントリのタイムスタンプ 1 BigQuery テーブル名
syslog 2017-05-23T18:19:22.135Z syslog_20170523
apache-access 2017-01-01T00:00:00.000Z apache_access_20170101
compute.googleapis.com/activity_log 2017-12-31T23:59:59.999Z compute_googleapis_com_activity_log_20171231

1 ログエントリのタイムスタンプは UTC(協定世界時)で表されます。

スキーマとフィールド

エクスポートされたログに対する BigQuery テーブル スキーマは、LogEntry タイプの構造とログのペイロードの内容に基づいています。テーブル スキーマを確認するには、BigQuery ウェブ UI でエクスポートされたログエントリのテーブルを選択します。

複雑なログエントリのペイロードを表すために使用される BigQuery テーブル スキーマはわかりにくい場合があります。エクスポートされた監査ログの場合は、いくつかの特別な命名規則が使用されます。詳しくは、エクスポートしたログの BigQuery スキーマをご覧ください。

クエリ

ログを BigQuery にエクスポートするクエリの例については、サンプルクエリをご覧ください。

BigQuery クエリ シンタックスの詳細については、クエリ リファレンスをご覧ください。複数のテーブルへのクエリが可能なテーブル ワイルドカード関数と、繰り返されるフィールドからデータを表示する Flatten 演算子は、特に便利です。

Compute Engine ログエントリのサンプル

次の BigQuery クエリは、複数の日付と複数のログタイプからログエントリを取得します。

  • このクエリは過去 3 日間の syslogapache-access のログを検索します。このクエリは 2015 年 2 月 23 日に作成されたので、2 月 21 日と 2 月 22 日に受け取ったすべてのログエントリと、2 月 23 日のクエリ発行時刻までに受け取ったログエントリを対象とします。

  • このクエリは、1 つの Compute Engine インスタンス 1554300700000000000 の結果を取得します。

SELECT
  timestamp AS Time,
  logName as Log,
  textPayload AS Message
FROM
  (TABLE_DATE_RANGE(my_bq_dataset.syslog_,
    DATE_ADD(CURRENT_TIMESTAMP(), -2, 'DAY'), CURRENT_TIMESTAMP())),
  (TABLE_DATE_RANGE(my_bq_dataset.apache_access_,
    DATE_ADD(CURRENT_TIMESTAMP(), -2, 'DAY'), CURRENT_TIMESTAMP()))
WHERE
  resource.type == 'gce_instance'
  AND resource.labels.instance_id == '1554300700000000000'
ORDER BY time;

出力行の例は次のようになります。

Row | Time                    | Log                                         | Message
--- | ----------------------- | ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------
 5  | 2015-02-21 03:40:14 UTC | projects/project-id/logs/syslog             | Feb 21 03:40:14 my-gce-instance collectd[24281]: uc_update: Value too old: name = 15543007601548826368/df-tmpfs/df_complex-used; value time = 1424490014.269; last cache update = 1424490014.269;
 6  | 2015-02-21 04:17:01 UTC | projects/project-id/logs/syslog             | Feb 21 04:17:01 my-gce-instance /USR/SBIN/CRON[8082]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
 7  | 2015-02-21 04:49:58 UTC | projects/project-id/logs/apache-access      | 128.61.240.66 - - [21/Feb/2015:04:49:58 +0000] "GET / HTTP/1.0" 200 536 "-" "masscan/1.0 (https://github.com/robertdavidgraham/masscan)"
 8  | 2015-02-21 05:17:01 UTC | projects/project-id/logs/syslog             | Feb 21 05:17:01 my-gce-instance /USR/SBIN/CRON[9104]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
 9  | 2015-02-21 05:30:50 UTC | projects/project-id/log/syslogapache-access | 92.254.50.61 - - [21/Feb/2015:05:30:50 +0000] "GET /tmUnblock.cgi HTTP/1.1" 400 541 "-" "-"

App Engine ログエントリのサンプル

次の BigQuery クエリは、過去 1 か月の失敗した App Engine リクエストを取得します。

SELECT
  timestamp AS Time,
  protoPayload.host AS Host,
  protoPayload.status AS Status,
  protoPayload.resource AS Path
FROM
  (TABLE_DATE_RANGE(my_bq_dataset.appengine_googleapis_com_request_log_,
    DATE_ADD(CURRENT_TIMESTAMP(), -1, 'MONTH'), CURRENT_TIMESTAMP()))
WHERE
  protoPayload.status != 200
ORDER BY time

結果の例は次のようになります。

Row | Time                    | Host                                  | Status | Path
--- | ----------------------- | ------------------------------------- | ------ | ------
 6  | 2015-02-12 19:35:02 UTC | default.my-gcp-project-id.appspot.com |    404 | /foo?thud=3
 7  | 2015-02-12 19:35:21 UTC | default.my-gcp-project-id.appspot.com |    404 | /foo
 8  | 2015-02-16 20:17:19 UTC | my-gcp-project-id.appspot.com         |    404 | /favicon.ico
 9  | 2015-02-16 20:17:34 UTC | my-gcp-project-id.appspot.com         |    404 | /foo?thud=%22what???%22

Pub/Sub

Pub/Sub でストリーミングされるときにエクスポートされたログを表示する方法は次のとおりです。

  1. Cloud Console の [Pub/Sub] ページに移動します。

    [Pub/Sub] に移動

  2. ログ エクスポートに使用されているトピックのサブスクリプションを検索または作成して、そこからログエントリを pull します。新しいログエントリの公開には時間がかかる場合があります。

ログを整理する方法の詳細については、このページのエクスポートしたログの構成をご覧ください。

エクスポートしたログの可用性

エクスポートされたログがない場合は、エクスポート システムの指標を確認します。エクスポート システムの指標では、エクスポートされたログエントリの数と、エラーによってドロップされたログエントリの数がわかります。エクスポート システムの指標にログエントリがエクスポートされていないことが示されている場合は、エクスポート クエリで、クエリに一致するログエントリが最近 Logging に到着していることを確認します。

[ログのエクスポート] に移動

Pub/Sub トピックにログのエクスポートを行うと、Logging は各ログエントリを受け取るとすぐに、そのログエントリを Pub/Sub メッセージとして公開します。

エクスポートしたログの構成

各メッセージの data フィールドは、Base64 エンコードの LogEntry オブジェクトです。たとえば、Pub/Sub サブスクライバーが、ログエントリを受け取るトピックから次のようなオブジェクトを pull したとします。ここで示すオブジェクトに含まれているリストにはメッセージが 1 つしかありませんが、複数のログエントリがある場合は、Pub/Sub が複数のメッセージを返すことがあります。この例では、見やすくするために data 値(約 600 字)と ackId 値(約 200 字)を短縮しています。

{
 "receivedMessages": [
  {
   "ackId": "dR1JHlAbEGEIBERNK0EPKVgUWQYyODM...QlVWBwY9HFELH3cOAjYYFlcGICIjIg",
   "message": {
    "data": "eyJtZXRhZGF0YSI6eyJzZXZ0eSI6Il...Dk0OTU2G9nIjoiaGVsbG93b3JsZC5sb2cifQ==",
    "attributes": {
     "compute.googleapis.com/resource_type": "instance",
     "compute.googleapis.com/resource_id": "123456"
    },
    "messageId": "43913662360"
   }
  }
 ]
}

data フィールドをデコードしてフォーマットすると、次のような LogEntry オブジェクトを取得できます。

{
  "log": "helloworld.log",
  "insertId": "2015-04-15|11:41:00.577447-07|10.52.166.198|-1694494956",
  "textPayload": "Wed Apr 15 20:40:51 CEST 2015 Hello, world!",
  "timestamp": "2015-04-15T18:40:56Z",
  "labels": {
    "compute.googleapis.com\/resource_type": "instance",
    "compute.googleapis.com\/resource_id": "123456"
  },
  "severity": "WARNING"
  }
}

サードパーティと Pub/Sub の統合

Logging では、ロギングをサードパーティと統合できます。最新の統合リストについては、Stackdriver の統合をご覧ください。

Pub/Sub トピックからログをエクスポートすると、サードパーティは同じトピックにサブスクライブすることでログを受信できます。

統合を行うには、次の方法と同様のことをする必要があります。

  1. Google Cloud プロジェクトから作成した Google Cloud サービス アカウント名をサードパーティから取得します。例: 12345-xyz@developer.gserviceaccount.comこの名前を使用して、ログを受け取る権限をサードパーティに付与します。

  2. ログを含むプロジェクトで、

  3. Pub/Sub必要な を有効にします。

    を有効にする

  4. Pub/Sub トピックを作成します。ログシンクの構成か、次の手順で行います。

    1. Pub/Sub トピックリストに移動します。
    2. [トピックの作成] を選択し、トピック名を入力します。例: projects/my-project-id/topics/my-pubsub-topicこのトピックにログをエクスポートします。

      トピックに送信される各メッセージは、Pub/Sub メッセージ attributes でエクスポートされたログエントリのタイムスタンプを含みます。例:

      "attributes": {
        "logging.googleapis.com/timestamp": "2018-10-01T00:00:00Z"
      }
      
    3. [作成] をクリックします。

    4. Logging からそのトピックにログをエクスポートすることを承認します。この手順については、Pub/Sub の権限の設定をご覧ください。

  5. サードパーティがトピックをサブスクライブすることを承認します。

    1. Cloud Console で、プロジェクトの Pub/Sub トピックリストにとどまります。
    2. 新しいトピックを選択します。
    3. [権限] を選択します。
    4. サードパーティのサービス アカウント名を入力します。
    5. [役割を選択] メニューの [Pub/Sub サブスクライバー] を選択します。
    6. [追加] をクリックします。
  6. サードパーティに Pub/Sub トピック名を知らせます。たとえば、projects/my-project-number/topics/my-pubsub-topic。エクスポートを開始する前に、サードパーティでそのトピックをサブスクライブする必要があります。

  7. サードパーティがトピックをサブスクライブしたら、ログのエクスポートを開始します。

    1. エクスポートするログを含むプロジェクトで、検索クエリボックスの上にある [エクスポートを作成] をクリックします。[エクスポートの編集] パネルが開きます。

      [エクスポートの編集] パネル

    2. [シンク名] を入力します。

    3. [シンクサービス] メニューで、[Cloud Pub/Sub] を選択します。

    4. [シンクのエクスポート先] メニューで、サードパーティがサブスクライブしている Pub/Sub トピックを選択します。

    5. [シンクを作成] を選択して、エクスポートを開始します。

    6. [シンクが作成されました] ダイアログが表示されます。これは、エクスポート シンクが、選択された宛先に今後一致するログを書き込む権限付きで正常に作成されたことを示します。

直ちにサードパーティでのログエントリの受信が開始されます。

ログエントリのオブジェクト

Logging のログエントリは、LogEntry 型のオブジェクトです。

LogEntry リファレンスで [LOG_ID] と呼ばれる同じログタイプのログエントリは、通常同じ形式です。次の表にログエントリの例を示します。

syslog

Compute Engine の syslog は、仮想マシン インスタンスで実行されるロギング エージェント google-fluentd によって生成されるカスタム ログタイプです。

{
  logName: "projects/my-gcp-project-id/logs/syslog",
  timestamp: "2015-01-13T19:17:01Z",
  resource: {
    type: "gce_instance",
    labels: {
      instance_id: "12345",
      zone: "us-central1-a",
      project_id: "my-gcp-project-id"
    }
  },
  insertId: "abcde12345",
  textPayload: "Jan 13 19:17:01 my-gce-instance /USR/SBIN/CRON[29980]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)"
}

request_log

App Engine request_log のログエントリには、RequestLog 型のオブジェクトを持つ protoPayload フィールドがあります。

{
  logName: "projects/my-gcp-project-id/logs/appengine.googleapis.com%2Frequest_log",
  timestamp: "2015-01-13T19:00:39.796169Z",
  resource: {
    type: "gae_app",
    labels: {
      module_id: "default",
      zone: "us6",
      project_id: "my-gcp-project-id",
      version_id: "20150925t173233"
    }
  }
  httpRequest: {
    status: 200
  }
  insertId: "abcde12345",
  operation: {
    id: "abc123",
    producer: "appengine.googleapis.com/request_id",
    first: true,
    last: true
  }
  protoPayload: {
    @type: "type.googleapis.com/google.appengine.logging.v1.RequestLog"
    versionId: "20150925t173233",
    status: 200,
    startTime: "2017-01-13T19:00:39.796169Z",
    # ...
    appId: "s~my-gcp-project-id",
    appEngineRelease: "1.9.17",
  }
}

activity

activity ログは管理アクティビティの監査ログです。そのペイロードは、AuditLog 型の JSON 表現です。

{
 logName: "projects/my-gcp-project-id/logs/cloudaudit.googleapis.com%2Factivity"
 timestamp: "2017-04-22T13:41:32.245Z"
 severity: "NOTICE"
 resource: {
  type: "gce_instance"
  labels: {
   instance_id: "2403273232180765234"
   zone: "us-central1-b"
   project_id: "my-gcp-project-id"
  }
 }
 insertId: "54DC1882F4B49.A4996C2.6A02F4C1"
 operation: {
  id: "operation-1492868454262-54dc185e9a4f0-249fe233-f73d472a"
  producer: "compute.googleapis.com"
  last: true
 }
 protoPayload: {
  @type: "type.googleapis.com/google.cloud.audit.AuditLog"
  authenticationInfo: {
   principalEmail: "649517127304@cloudservices.gserviceaccount.com"
  }
  requestMetadata: {…}
  serviceName: "compute.googleapis.com"
  methodName: "v1.compute.instances.delete"
  resourceName: "projects/my-gcp-project-id/zones/us-central1-b/instances/abc123"
 }
}

遅れて到着するログエントリ

エクスポートしたログエントリは、1 時間ごとに一括して Cloud Storage バケットに保存されます。最初のエントリが表示されるまでに 2~3 時間かかることがあります。エクスポートされたログのファイル シャードに An(「Append」)という接尾辞が付いている場合は、遅れて到着したログエントリが含まれています。

エクスポート先に停電が発生した場合、Stackdriver Logging は停電が終わるまでデータを保護します。

また、App Engine は、タイプ google.appengine.logging.v1.LogLine(AppLog または AppLogLine とも呼ばれる)の複数のサブエントリを、ログ アクティビティを発生させたリクエストを表すタイプ google.appengine.logging.v1.RequestLog のプライマリ ログエントリの下で結合します。各ログ行には、プライマリ エントリを識別するリクエスト ID が含まれます。ログビューアには、ログ行がリクエスト ログエントリと表示されます。Logging は、タイムスタンプでは次のバッチに入る場合にも、すべてのログ行を元のリクエストとともにバッチに入れることを試みます。それができない場合、リクエスト ログエントリでいくつかのログ行が失われて、次のバッチにリクエストのない「孤立した」ログ行が存在することがあります。このような可能性を重くみる場合は、ログを処理するときにリクエストの各部分をつなぎ直せるように準備してください。

料金

エクスポートされたログには Stackdriver Logging の料金はかかりませんが、エクスポート先料金が適用されることがあります。詳しくは、該当するプロダクトの料金のページをご覧ください。

Stackdriver Logging から Virtual Private Cloud フローログを送信して除外した場合は、エクスポート先料金に加え VPC フローログの生成料金が適用されることにもご注意ください。