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

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

ログのエクスポートの概要については、ログのエクスポートの概要をご覧ください。

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

Cloud Storage

エクスポートしたログを Cloud Storage で確認するには、次の手順に従います。

  1. GCP Console の Cloud Storage ブラウザに移動します。

    Cloud Storage ブラウザ

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

バケット内のログの保存形式について詳しくは、Cloud Storage の構成をご覧ください。

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

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

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

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

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

Cloud Storage バケットにログをエクスポートすると、Stackdriver Logging によって一式のファイルがバケットに書き込まれます。ファイルは、ログタイプと日時別にディレクトリ構造で構成されます。ログタイプは 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 つのバケットに複数のリソースタイプのログを含めることができます。

Stackdriver Logging では、同一または重複するフィルタを含むシンクからのログエントリの重複排除が保証されません。これらのシンクからのログエントリは、Cloud Storage バケットに複数回書き込まれる可能性があります。

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

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 型をご覧ください。

ファイル内のログエントリのソート順は、一貫していないか保証されないことに注意してください。

BigQuery

BigQuery でエクスポートしたログを表示するには、次の手順に従います。

  1. GCP Console の BigQuery UI に移動します。

    BigQuery UI に移動する

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

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

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

BigQuery の可用性

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

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

ログエントリは、BigQuery に一括で保存されます。最初のエントリが表示されるまでに数分かかる場合があります。

テーブルの構成

BigQuery データセットにログをエクスポートすると、Stackdriver 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 監査ログクエリを参照してください。

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

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

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

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

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

  • このクエリは、Stackdriver Monitoring エンドポイント ヘルス チェッカー Stackdriver_terminus_bot からのトラフィックを無視します。

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'
  AND NOT (textPayload CONTAINS 'Stackdriver_terminus_bot')
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

Cloud Pub/Sub

Cloud Pub/Sub でストリーミングされる、エクスポートしたログを表示するには、次の手順に従います。

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

    Cloud Pub/Sub に移動

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

ログの構成方法について詳しくは、エクスポートされたログの構成をご覧ください。

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

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

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

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

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

各メッセージの data フィールドは、Base64 エンコードの LogEntry オブジェクトです。たとえば、Cloud Pub/Sub サブスクライバーが、ログエントリを受け取るトピックから次のようなオブジェクトを pull したとします。この例のオブジェクトに含まれているリストにはメッセージが 1 つしかありませんが、複数のログエントリがある場合は、Cloud 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"
  }
}

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

Stackdriver Logging のログエントリは、LogEntry 型のオブジェクトです。次の表に、ログエントリの特に重要なフィールドを示します。

通常、特定の [LOG_ID] を持つすべてのログエントリの形式は同じです。ペイロード フィールドのコンテンツは、ログタイプごとにドキュメント化されています。例については、Stackdriver Logging ログ インデックスをご覧ください。以下に、ログエントリの例をいくつか示します。

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

また、App Engine では、タイプ google.appengine.logging.v1.LogLine(AppLog または AppLogLine とも呼ばれる)の複数のサブエントリが、ログ アクティビティを発生させたリクエストを表すタイプ google.appengine.logging.v1.RequestLog のプライマリ ログエントリの下で結合されます。各ログ行には、プライマリ エントリを識別するリクエスト ID が含まれます。ログビューアには、リクエスト ログエントリのログ行が表示されます。Stackdriver Logging では、タイムスタンプがその次の一括ファイルの対象であっても、すべてのログ行を元のリクエストの一括ファイルに含めることが試行されます。それが不可能な場合、リクエスト ログエントリに一部のログ行が含まれず、その次の一括ファイルにリクエストのない「オーファン」ログ行が含まれることになります。このような可能性が重要である場合は、ログを処理するときにリクエストの各部分をつなぎ直す対策をしてください。

Cloud Pub/Sub を介したサードパーティとの統合

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

Cloud Pub/Sub トピックを介してログをエクスポートすると、サードパーティで同じトピックをサブスクライブしてログを受け取ることができます。

統合を行うには、次の手順と同様の手順を行う必要があります。

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

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

    APIを有効にする

  3. Pub/Sub トピックを作成します。ログシンクのセットアップで作成するか、次の手順で作成します。

    1. Pub/Sub トピックリストを開きます。
    2. [トピックを作成] を選択し、トピック名を入力します。たとえば、projects/my-project-id/topics/my-pubsub-topic です。このトピックにログをエクスポートします。
    3. [作成] を選択します。
    4. Stackdriver Logging からそのトピックにログをエクスポートすることを承認します。Cloud Pub/Sub の権限を設定するをご覧ください。
  4. サードパーティがトピックをサブスクライブすることを承認します。

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

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

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

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

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

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

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

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

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

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

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。