在 GCP 中創建基於日誌的指標 (LBM) 所需的 Python Google云函式日誌記錄的 jsonPayload(結構化日誌記錄)輸出
我需要
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 中選擇任何標籤: