查看已轉送至 BigQuery 的記錄

本文說明如何找出從 Cloud Logging 轉送至 BigQuery 資料表的記錄項目。記錄接收器會將記錄資料以小批次的形式串流至 BigQuery,因此您不必執行載入工作,即可查詢資料。為協助您建立查詢及瞭解 BigQuery 資料表的格式,本文也說明已路由記錄的 BigQuery 結構定義

Cloud Logging 會使用舊版串流 API,將記錄項目串流至 BigQuery。記錄項目通常會在 BigQuery 中顯示,時間間隔不到一分鐘。不過,建立新資料表時,可能需要幾分鐘後才會顯示第一筆記錄項目。

事前準備

如要瞭解接收器的概念,請參閱「轉送和儲存空間模型總覽:接收器」。

如需轉送記錄檔的操作說明,請參閱「轉送記錄檔至支援的目的地」。

如要瞭解已路由記錄項目欄位的命名方式,請參閱已路由記錄的 BigQuery 結構定義

查看記錄

如要查看已傳送至 BigQuery 的記錄,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「BigQuery」BigQuery頁面:

    前往 BigQuery Studio

    您也可以透過搜尋列找到這個頁面。

  2. 在「Explorer」面板中展開專案並選取資料集。

    您可以在「Details」(詳細資料) 分頁中看到記錄項目,也可以查詢資料表以傳回資料。

查詢範例

如要瞭解 BigQuery 查詢語法,請參閱「查詢參考資料」。表格萬用字元函式flatten 運算子特別實用,前者可讓您跨多個資料表進行查詢,後者允許顯示來自重複欄位的資料。

Compute Engine 查詢範例

下列 BigQuery 查詢會擷取多天與多種記錄類型的記錄項目:

  • 查詢會搜尋前三天的記錄 syslogapache-access。查詢日期為 2020 年 2 月 23 日,涵蓋 2 月 21 日與 2 月 22 日收到的所有記錄項目,以及在 2 月 23 日發出查詢之前收到的記錄項目。

  • 查詢會針對單一 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  | 2020-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  | 2020-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  | 2020-02-21 04:49:58 UTC | projects/project-id/logs/apache-access      | 128.61.240.66 - - [21/Feb/2020:04:49:58 +0000] "GET / HTTP/1.0" 200 536 "-" "masscan/1.0 (https://github.com/robertdavidgraham/masscan)"
 8  | 2020-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  | 2020-02-21 05:30:50 UTC | projects/project-id/log/syslogapache-access | 92.254.50.61 - - [21/Feb/2020:05:30:50 +0000] "GET /tmUnblock.cgi HTTP/1.1" 400 541 "-" "-"

App Engine 查詢範例

下列 BigQuery 查詢會擷取上個月失敗的 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  | 2020-02-12 19:35:02 UTC | default.my-gcp-project-id.appspot.com |    404 | /foo?thud=3
 7  | 2020-02-12 19:35:21 UTC | default.my-gcp-project-id.appspot.com |    404 | /foo
 8  | 2020-02-16 20:17:19 UTC | my-gcp-project-id.appspot.com         |    404 | /favicon.ico
 9  | 2020-02-16 20:17:34 UTC | my-gcp-project-id.appspot.com         |    404 | /foo?thud=%22what???%22

已轉送記錄的 BigQuery 結構定義

已路由記錄的 BigQuery 資料表結構定義是以 LogEntry 類型的結構和記錄酬載的內容為基礎。Cloud Logging 也會運用規則,縮短稽核記錄和特定結構化酬載欄位的 BigQuery 結構定義欄位名稱。您可以在 BigQuery 介面中選取具有已路由記錄項目的資料表,查看資料表結構定義。

這個目的地不支援「LogEntry.errorGroups」欄位。 記錄接收器會轉送傳送至專案的記錄項目,但這些記錄項目不含錯誤群組。

用來表示複雜記錄項目酬載的 BigQuery 資料表結構定義可能會令人困惑,而且如果是已路由的稽核記錄,系統會使用一些特殊命名規則。詳情請參閱本頁的「稽核記錄欄位」一節。

欄位命名慣例

將記錄傳送至 BigQuery 時,記錄項目欄位適用以下命名慣例:

  • 記錄項目欄位名稱的長度不得超過 128 個字元。

  • 記錄項目欄位名稱只能由英數字元組成。系統會從欄位名稱中移除所有不支援的字元,並替換成底線字元。舉例來說,jsonPayload.foo%% 會轉換為 jsonPayload.foo__

    即使經過轉換,記錄項目欄位名稱開頭也必須是英數字元,開頭的底線會遭到移除。

  • 如果是屬於 LogEntry 類型中的記錄項目欄位,則對應的 BigQuery 欄位名稱與記錄項目欄位完全相同。

  • 如果是使用者提供的記錄項目欄位,對應的 BigQuery 欄位名稱會標準化為小寫,但仍保留命名。

  • 如果是結構化酬載中的欄位,只要當中沒有 @type 指定碼,對應的 BigQuery 欄位名稱就會標準化為小寫,但仍保留命名。

    如要瞭解內含 @type 指定碼的結構化酬載,請參閱本頁的「具有 @type 的酬載欄位」一節。

以下範例說明如何運用這些命名慣例:

記錄項目欄位 LogEntry 類型對應 BigQuery 欄位名稱
insertId insertId insertId
textPayload textPayload textPayload
httpRequest.status httpRequest.status httpRequest.status
httpRequest.requestMethod.GET httpRequest.requestMethod.[ABC] httpRequest.requestMethod.get
resource.labels.moduleid resource.labels.[ABC] resource.labels.moduleid
jsonPayload.MESSAGE jsonPayload.[ABC] jsonPayload.message
jsonPayload.myField.mySubfield jsonPayload.[ABC].[XYZ] jsonPayload.myfield.mysubfield

具有 @type 的酬載欄位

本節將探討酬載中含有指定碼 @type 的記錄項目所對應的特殊 BigQuery 結構定義欄位名稱,如要瞭解稽核記錄的命名規則,請參閱本頁的「稽核記錄欄位」一節。

記錄項目的酬載可以包含結構化資料。任何結構化欄位都可以包含選用型別指定符,格式如下:

@type: type.googleapis.com/[TYPE]

@type」的命名規則

如果結構化欄位有類型指定碼,通常會將 [TYPE] 附加至欄位名稱,做為 BigQuery 欄位名稱。[TYPE] 的值可以是任何字串。

記錄項目類型會決定含有 @type 規範的欄位命名規則。如果是稽核記錄以外的記錄項目,這些規則只會套用至 jsonPayloadprotoPayload 的頂層,系統會忽略巢狀欄位。如要瞭解稽核記錄的命名規則,請參閱本頁的「稽核記錄欄位」一節。

處理頂層結構化酬載欄位時,記錄檔會移除前置字元 type.googleapis.com

舉例來說,下表顯示非稽核記錄的頂層結構化酬載欄位,對應至 BigQuery 欄位名稱:

酬載 酬載 @type 酬載欄位 BigQuery 欄位名稱
jsonPayload (無) statusCode jsonPayload.statusCode
jsonPayload type.googleapis.com/abc.Xyz statusCode jsonpayload_abc_xyz.statuscode
protoPayload (無) statusCode protoPayload.statuscode
protoPayload type.googleapis.com/abc.Xyz statusCode protopayload_abc_xyz.statuscode

如果是含有類型指定碼的欄位,上述規則會有一些例外:

  • 在 App Engine 要求記錄中,即使酬載包含類型指定碼,傳送至 BigQuery 的記錄酬載名稱也會是 protoPayload

  • 上表不適用於稽核記錄。Cloud Logging 會運用一些特殊規則,縮短稽核記錄的 BigQuery 結構定義欄位名稱。我們將在本頁面的「稽核記錄欄位」一節中討論。

範例

這個範例說明 BigQuery 收到結構化酬載時,酬載欄位的命名和使用方式。

假設記錄項目酬載的結構化方式如下:

jsonPayload: {
  @type: