排解記錄檔分析設定問題

本文說明如何解決使用 Google Cloud 控制台的「Log Analytics」頁面時可能發生的錯誤。

錯誤訊息

本節說明您可能會看到的錯誤訊息,以及如何解決對應的錯誤狀況。

No completion signal within allotted timeframe 錯誤訊息

輸入 SQL 查詢並選取「執行查詢」。查詢未完成,且您看到下列錯誤訊息:

The query failed to execute and return results due to error: No completion signal within allotted timeframe.

如要解決這項錯誤,請執行下列任一操作:

  • 縮短查詢記錄的間隔,然後重試查詢。 舉例來說,如果查詢間隔為 14 天,請將間隔縮短為 7 天,然後執行查詢。

  • 建立連結的 BigQuery 資料集,然後從 BigQuery 介面執行查詢。BigQuery 介面支援的查詢執行時間比 Cloud Logging 介面更長。詳情請參閱查詢連結的 BigQuery 資料集

針對具有不同 CMEK 金鑰的 bucket 執行查詢時,會顯示錯誤訊息

輸入查詢多個記錄檔值區的 SQL 查詢,然後選取「執行查詢」。查詢未完成,且您看到下列錯誤訊息:

Queries against buckets with distinct CMEK keys must have a key configured in the LogSettings.

如要解決這個問題,請採取下列任一做法:

  • 設定記錄 bucket,使用相同的 Cloud Key Management Service (Cloud KMS) 金鑰。
  • 如果記錄值區位於相同位置,您可以為記錄值區的父項資源 (資料夾或機構) 設定預設 Cloud KMS 金鑰。父項的預設金鑰必須與記錄 bucket 位於相同位置。採用這項設定後,上層的預設金鑰會加密 Log Analytics 查詢產生的任何暫時資料。詳情請參閱「記錄分析限制」。

FROM 子句中只能包含一個檢視區塊錯誤訊息

您在 Google Cloud 控制台的「記錄檔分析」頁面查詢窗格中輸入 SQL 查詢,但 SQL 剖析器顯示下列錯誤:

FROM clause must contain exactly one log view

如果 FROM 陳述式中指定的資料表無法解析為特定記錄檢視,就會回報先前的錯誤。

如要解決這項錯誤,請確認資料表名稱的語法正確無誤:

  • 確認資料表名稱符合 Log Analytics 命名配置的必要語法。BigQuery 和記錄檔分析對資料表名稱有不同的規定。如要查看資料表名稱的必要語法,請查看預設查詢

  • 如果記錄 bucket 的 Google Cloud 專案 ID、區域、bucket ID 或檢視區塊 ID 包含句號字元 (.),請務必以單一反引號 (`) 包住每個欄位。

    舉例來說,如果專案 ID 為 Google Cloud ,如要查詢 _Default 記錄值區的 _AllLogs 檢視區塊,請使用下列語法指定資料表:example.com:bluebird

    
    SELECT *
    FROM `example.com:bluebird`.`global`.`_Default`.`_AllLogs`
    

    先前的查詢假設 _Default bucket 位於 global 區域。

無法儲存查詢

您想儲存目前的查詢,因此執行查詢,然後按一下「儲存」儲存,但「儲存查詢」選項已停用,或您無法完成對話方塊步驟。

造成這項錯誤的原因是組織政策與 Cloud Logging 的預設資源設定發生衝突。對於組織或資料夾,您可以設定 Cloud Logging 的預設資源設定,指定位置。這個位置會儲存您儲存的查詢。不過,如果位置與機構政策衝突,系統就無法儲存查詢。

如要解決這項失敗問題,請要求貴機構的管理員更新 Cloud Logging 的預設資源設定,確保位置設定符合貴機構的政策規定。詳情請參閱「設定 Cloud Logging 的預設資源設定」。

如果已啟用「儲存查詢」選項,但您無法完成對話方塊並儲存查詢,請按照下列步驟操作:

  1. 確認查詢不含語法錯誤。 你只能儲存有效查詢。
  2. 選用:將查詢複製到剪貼簿。
  3. 請重新載入頁面。
  4. 如果您已將查詢複製到剪貼簿,請將查詢貼到「Query」(查詢) 窗格,執行查詢,然後執行儲存作業。

無法建立 Analytics 檢視

您想建立分析檢視畫面,因此輸入並執行 SQL 查詢,然後按一下「儲存」,但「另存為分析檢視畫面」選項已停用。

如要解決這個問題,請確認您的 IAM 角色包含下列權限:

  • observability.analyticsViews.{get, list, create, update, delete}

任何預先定義的 Cloud Logging 角色都不具備這些權限。 如要瞭解必要角色,請參閱「建立及查詢 Analytics 檢視區塊:事前準備」一文。

無法查詢 Analytics 資料檢視

您想查詢數據分析檢視區塊,但「記錄檔分析」頁面的「檢視區塊」窗格未顯示任何數據分析檢視區塊。

如要解決這項問題,請嘗試下列方法:

  • 確認 IAM 角色具備下列權限:

    • observability.analyticsViews.{get, list}

    任何預先定義的 Cloud Logging 角色都不具備這些權限。 如要瞭解必要角色,請參閱「建立及查詢 Analytics 檢視區塊:事前準備」一文。

  • 確認專案中存在 Analytics 資料檢視。 Google Cloud

無法存取「記錄檔分析」頁面

您在 Google Cloud 控制台中開啟「Log Analytics」頁面,但系統顯示權限遭拒的錯誤訊息。

如要取得載入「記錄檔分析」頁面、執行查詢及查看記錄所需的權限,請要求管理員在專案中授予您下列 IAM 角色:

您或許也能透過自訂角色或記錄預先定義的角色,取得必要權限。

如要在「記錄檔分析」頁面中查看記錄項目及執行查詢,您需要與「記錄檔探索工具」頁面相同的權限。如要瞭解查詢使用者定義 bucket 中的檢視區塊,或查詢 _Default 記錄 bucket 的 _AllLogs 檢視區塊時,需要哪些其他角色,請參閱「Cloud Logging 角色」。

無法升級記錄檔 bucket 以使用記錄檔分析

建立記錄檔 bucket 並選取使用記錄檔分析的選項,或升級現有記錄檔 bucket 以使用記錄檔分析。升級失敗,並出現類似下列的錯誤狀況:

Failed precondition (HTTP 400): Constraint "my-constraint" violated for PROJECT_ID  with location global.

先前的錯誤訊息指出貴機構已設定機構政策,限制可使用的區域。如要升級記錄檔 bucket 並使用記錄檔分析,必須使用 global 區域。如果可以移除限制使用 global 區域的機構政策,即可升級記錄值區。否則無法升級記錄檔值區。

建立連結的 BigQuery 資料集失敗

您編輯記錄檔 bucket 來建立連結的 BigQuery 資料集,或是建立新的記錄檔 bucket 並選取建立連結資料集的選項,但系統未建立連結的資料集。

如要解決這個錯誤,請要求系統管理員為 Google Cloud 專案 Google Cloud 授予您包含下列權限的 IAM 角色:

  • logging.links.create

「記錄檔管理員」(roles/logging.admin) 和「記錄檔設定寫入者」(roles/logging.configWriter) 角色都具備上述權限。

如要瞭解角色和權限,請參閱「使用 IAM 控管存取」。

無法刪除連結的 BigQuery 資料集

您不再需要連結的資料集,但刪除該資料集的選項已停用。

如要解決這個錯誤,請要求系統管理員為 Google Cloud 專案 Google Cloud 授予您包含下列權限的 IAM 角色:

  • logging.links.delete

「記錄檔管理員」(roles/logging.admin) 和「記錄檔設定寫入者」(roles/logging.configWriter) 角色都具備上述權限。

您可以使用這項權限,從 Google Cloud 控制台的「記錄儲存空間」頁面刪除已連結的資料集。如要進一步瞭解角色和權限,請參閱「使用 IAM 控管存取」。

記錄檔分析顯示有關機密中繼資料的警告

「Log Analytics」(記錄分析) 頁面會顯示類似下列內容的訊息:

This SQL query is configured to run on the BigQuery engine using [PROJECT_ID],
and references resources from [RESOURCE, ...]. Sensitive metadata,
including table contents, may be written to [PROJECT_ID].

這則警告訊息表示查詢跨越擁有權界線,並提供您在執行查詢前驗證查詢的機會。擁有權界線取決於多項因素,其中一項是查詢使用的資源階層。

您無法避免這類警告。

如果「Log Analytics」(記錄檔分析) 頁面顯示警告對話方塊,您可以執行下列任一操作:

  • 如果您確定查詢可安全執行,且想查看查詢結果,請按一下「確認並執行」

  • 分析查詢內容,並視需要捨棄查詢。舉例來說,您可能執行下列操作:

    1. 檢查查詢。檢查時,請考量查詢的資料、查詢資料集的潛在大小,以及查詢引擎。在 BigQuery 服務上執行的查詢可能會產生費用。
    2. 如果收到 Log Analytics 頁面的連結,請確認寄件者是可信來源。

Google Cloud 提供多項功能,有助於防止資料遭網路釣魚、內部攻擊或外部實體竊取。詳情請參閱「使用記錄檔分析確保資料安全」。

無法將查詢引擎設為 BigQuery

「設定」選單中的 BigQuery 選項已停用。

如要啟用這項選項,請按照下列步驟操作:

  1. 啟用 BigQuery Reservations API。
  2. 為專案設定預留的 BigQuery 運算單元
  3. 請確認您在查詢的記錄檔 bucket 中有連結的 BigQuery 資料集

「在 BigQuery 執行」按鈕已停用

如果系統顯示「在 BigQuery 中執行」按鈕,但按鈕處於停用狀態,表示查詢參照的記錄檢視區塊沒有連結的資料集。如要對 BigQuery 預留空間執行查詢,請在記錄檔 bucket 中建立連結的 BigQuery 資料集

沒有監控服務帳戶

您想建立警告政策,監控 SQL 查詢結果。 設定步驟要求您將 IAM 角色授予監控服務帳戶,但該帳戶不存在。

監控服務帳戶稱為「服務代理程式」,因為是由Google Cloud建立及管理。設定需要帳戶的資源或服務時,系統會自動建立帳戶。舉例來說,如果您建立 Pub/Sub 通知管道,系統可能會因此建立監控服務帳戶。

如要建立監控服務帳戶,並授予該帳戶 SQL 警告政策所需的權限,請按照下列步驟操作:

  1. 建立監控服務帳戶。詳情請參閱建立服務代理程式並授予角色

  2. 將下列角色授予監控服務帳戶:

監控服務帳戶權限遭拒錯誤

您想建立警告政策,監控 SQL 查詢結果。 但您會看到 PermissionDenied 錯誤,且訊息開頭為 Error authenticating service account

如要解決這項失敗問題,請將下列角色授予 Monitoring 服務帳戶:

記錄檔分析結果中出現重複的記錄項目

您執行的查詢會計算或回報重複項目。 由於 Logs Explorer 會根據記錄名稱、時間戳記和插入 ID 移除重複項目,您預期 Log Analytics 會在執行查詢前,先移除重複的記錄項目。

記錄檔分析不會執行與記錄檔探索工具相同的重複資料刪除作業。

如要解決記錄項目重複的問題,請嘗試下列方法:

  1. 判斷重複的記錄檔項目是否具有不同的接收時間戳記值。如果時間戳記不同,表示相同資料多次寫入記錄檔。

    如要解決重複寫入的問題,請調查記錄整合項目,找出錯誤訊息或設定錯誤。

  2. 如果值區已設定為使用 Cloud Key Management Service 金鑰,請確認您在配額範圍內,且金鑰一律可存取。如果超出配額或失去金鑰存取權,可能會導致記錄項目重複。

    如要解決這些失敗問題,請確認您未超出配額,且金鑰可供存取。

  3. 修改查詢,移除重複的記錄項目。

    舉例來說,假設 JSON 酬載包含 fieldAfieldB,前者是字串,後者是數值。此外,假設 JSON 酬載包含標示為 server 的欄位,其中包含字串。接著,請思考以下查詢:

    SELECT
      JSON_VALUE(json_payload.fieldA) AS fieldA
      SUM(IFNULL(SAFE_CAST(JSON_VALUE(json_payload.fieldB) AS INT64), 0)) AS sum_fieldB
    FROM
      `VIEW`
    WHERE
      JSON_VALUE(json_payload.server) = "test"
    GROUP BY
      fieldA;
    

    您可以修改查詢,移除重複的記錄項目,系統會檢查記錄名稱、時間戳記和插入 ID,判斷記錄項目是否重複:

    WITH
      deduplicated AS (
      SELECT
        JSON_VALUE(json_payload.fieldA) AS fieldA
        IFNULL(SAFE_CAST(JSON_VALUE(json_payload.fieldB) AS INT64), 0) AS fieldB
      FROM
        `VIEW` a
      WHERE
        JSON_VALUE(json_payload.server) = "test"
      QUALIFY
        ROW_NUMBER() OVER (PARTITION BY a.log_name, a.timestamp, a.insert_id ) = 1 )
    
    SELECT
      fieldA,
      SUM(fieldB) AS sum_fieldB
    FROM
      deduplicated
    GROUP BY
      fieldA;