Logging

在 GCP 中創建基於日誌的指標 (LBM) 所需的 Python Google云函式日誌記錄的 jsonPayload(結構化日誌記錄)輸出

  • April 4, 2022

我需要jsonPayload在 Google Cloud Function 的日誌中,而不是textPayload. 我的目標是使用字典的鍵作為基於日誌的度量的標籤(請參閱基於日誌的度量標籤),以便可以在 Grafana 中解決這些問題。

我正在使用 Python 的logging模組,但如果需要,我也可以切換到其他模組。

我需要在日誌中作為輸出:

jsonPayload: `{'key1':value1, 'key2':value2}`

但是我得到了一個textPayload輸出,整個下一行是一個字元串:

"2022-02-08 15:43:32,460 [INFO]: {"key1": value1, "key2": value2}"

日誌中的真實範例,在中間,您會看到textPayload

在此處輸入圖像描述

圖片作為文字:

{
insertId: "000000-1b431ffd-e42d-4f83-xyz"
labels: {1}
logName: "projects/MY_PROJECT/logs/cloudfunctions.googleapis.com%2Fcloud-functions"
receiveTimestamp: "2022-02-08T15:43:41.808217166Z"
resource: {2}
textPayload: "2022-02-08 15:43:32,460 [INFO]: {"json_metadata": {"countrows": 736203, "countcolumns": 6, "size": 48261360, "gcs_stamp": "2022-02-08 15:43:32.451000+00:00", "python_stamp": "2022-02-08 15:43:31.055538"}}"
timestamp: "2022-02-08T15:43:32.460Z"
trace: "projects/MY_PROJECT/traces/dd97759176248586a3d3xyz"
}

第一次嘗試

https://cloud.google.com/logging/docs/structured-logging閱讀:

在 Cloud Logging 中,結構化日誌是指使用 jsonPayload 欄位向其負載添加結構的日誌條目。結構化日誌記錄適用於使用者編寫的日誌。

在編寫結構化日誌之後,我嘗試獲取此“結構化日誌記錄”

logging.info(json.dumps(json_for_gcp_lbm))

但無濟於事。

進一步在連結中:有一個來自 GCP 的內置 Logging 代理,它使用fluentd關於 Logging 代理似乎僅適用於 Google Kubernetes Engine 或 App Engine,而不是 Google Cloud Function:

如果您使用的是 Google Kubernetes Engine 或 App Engine 柔性環境,則可以將結構化日誌作為 JSON 對象寫入單行序列化到 stdout 或 stderr。然後,Logging 代理將結構化日誌作為 LogEntry 結構的 jsonPayload 發送到 Cloud Logging。

我怎樣才能得到jsonPayload這個輸出?

您可以按照文件中的範例設置結構化日誌記錄。確保您的 python 版本是 3.8 或更高版本。另一種方法是使用Logging 客戶端庫

第二種方法的 OP 範例:

放入你的requirements.txt:

google-cloud-logging==3.0.0

作為撰寫本文時的最新版本。

from google.cloud import logging as gclogger

(或隨意命名)

並使用以下命令呼叫 json 日誌記錄:

json_for_gcp_lbm = {MY_JSON_HERE}

   from google.cloud import logging as gclogger

   ...

   logging_client = gclogger.Client()
   logger_name = "MY_LOG_NAME_OF_FREE_CHOICE" # Saved in the google cloud logs
   logger = logging_client.logger(logger_name)

   # I do not know how it would work with `import logging` as the 
   # built-in Python module, but I got it to work with adding
   # Following line does not work
   # logging.info(json.dumps(json_for_gcp_lbm, default=str))
   # Instead, we need 
   # https://cloud.google.com/logging/docs/samples/logging-write-log-entry#code-sample
   logger.log_struct(json_for_gcp_lbm)

這導致 jsonPayload 輸出:

在此處輸入圖像描述

然後您可以在“創建日誌指標”(基於日誌的指標/LBM)菜單中從 json 中選擇任何標籤:

在此處輸入圖像描述

引用自:https://serverfault.com/questions/1093143