本文說明如何找出從 Cloud Logging 轉送至 BigQuery 資料表的記錄項目。記錄接收器會將記錄資料以小批次的形式串流至 BigQuery,因此您不必執行載入工作,即可查詢資料。為協助您建立查詢及瞭解 BigQuery 資料表的格式,本文也說明已路由記錄的 BigQuery 結構定義。
Cloud Logging 會使用舊版串流 API,將記錄項目串流至 BigQuery。記錄項目通常會在 BigQuery 中顯示,時間間隔不到一分鐘。不過,建立新資料表時,可能需要幾分鐘後才會顯示第一筆記錄項目。
事前準備
如要瞭解接收器的概念,請參閱「轉送和儲存空間模型總覽:接收器」。
如需轉送記錄檔的操作說明,請參閱「轉送記錄檔至支援的目的地」。
如要瞭解已路由記錄項目欄位的命名方式,請參閱已路由記錄的 BigQuery 結構定義。
查看記錄
如要查看已傳送至 BigQuery 的記錄,請按照下列步驟操作:
-
前往 Google Cloud 控制台的「BigQuery」BigQuery頁面:
您也可以透過搜尋列找到這個頁面。
在「Explorer」面板中展開專案並選取資料集。
您可以在「Details」(詳細資料) 分頁中看到記錄項目,也可以查詢資料表以傳回資料。
查詢範例
如要瞭解 BigQuery 查詢語法,請參閱「查詢參考資料」。表格萬用字元函式與 flatten 運算子特別實用,前者可讓您跨多個資料表進行查詢,後者允許顯示來自重複欄位的資料。
Compute Engine 查詢範例
下列 BigQuery 查詢會擷取多天與多種記錄類型的記錄項目:
查詢會搜尋前三天的記錄
syslog和apache-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 規範的欄位命名規則。如果是稽核記錄以外的記錄項目,這些規則只會套用至 jsonPayload 或 protoPayload 的頂層,系統會忽略巢狀欄位。如要瞭解稽核記錄的命名規則,請參閱本頁的「稽核記錄欄位」一節。
處理頂層結構化酬載欄位時,記錄檔會移除前置字元 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: