簡體   English   中英

使用 Google Cloud Logging Python 庫發送帶有標簽的 JSON 有效負載

[英]Send a JSON Payload with labels using Google Cloud Logging Python library

我正在使用帶有 Cloud Functions 的google-cloud-logging Python 客戶端庫 我遵循建議並使用標准 Python 日志庫。 此庫的 v3+ 支持記錄 JSON 有效負載設置自定義元數據

我希望既設置自定義 label 並記錄 JSON 有效負載。 文檔提到可以使用json_fields extra參數來發送自定義 JSON 有效負載。 例子:

import logging

data_dict = {"hello": "world"}
logging.info("message field", extra={"json_fields": data_dict})

關於發送 label 文檔再次指向extra參數。 例子:

my_labels = {"foo": "bar"}
my_http = {"requestUrl": "localhost"}
my_trace = "01234"

logging.info(
    "hello", extra={"labels": my_labels, "http_request": my_http, "trace": my_trace}
)

按照上面的指導,我的印象是這應該可以同時實現:

image_metrics = {
    'total_images_sourced': 10,
    'total_images': 8
}

# Write custom metrics to Cloud Logging
logging.info("image_metrics", extra={
    "labels": {"type": "image"},
    "json_fields": image_metrics  
})

但是,生成的日志只有 output 一個文本有效負載。 JSON 有效載荷和 label 均未設置。

在此處輸入圖像描述

如何同時發送 JSON 有效負載以及 label?

更新 1 :當通過 Functions Framework 進行本地測試時,這似乎可以正常工作,但是當我部署完全相同的代碼庫以更新 Cloud Function 並再次運行時,它會導致文本有效負載並且沒有 label。

這原來是我的日志記錄設置的問題。 我將兩個日志記錄處理程序附加到我的根記錄器; 用於與 GCP 集成的 Cloud Logging 處理程序和用於輸出到控制台的 Streaming 處理程序。

import logging

import google.cloud.logging
from google.cloud.logging.handlers import CloudLoggingHandler

log_name = 'my_log_name'

# Root logger
logger = logging.getLogger(log_name)
logger.setLevel(logging.DEBUG)

# Stream handler to log messages in the console.
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.INFO)

# Cloud Logging handler to log messages in GCP.
gcloud_logging_client = google.cloud.logging.Client()
gcloud_logging_handler = CloudLoggingHandler(
    gcloud_logging_client, name=log_name
)

# Add handlers
logger.addHandler(gcloud_logging_handler)
logger.addHandler(stream_handler)

這看到我的日志消息打印到控制台,並在本地開發時以正確的格式發送到 Cloud Logging。 但是,StreamHandler 僅顯示未格式化的日志消息(不是 JSON 有效負載),並且 Cloud Logging Handler 在無服務器工作負載上不可靠。 這意味着我的 JSON 有效負載顯示為純文本消息。

事實證明,谷歌 python 日志庫提供了一種更簡單的方法來將日志發送到谷歌雲,使用:

client = google.cloud.logging.Client()
client.setup_logging()

使用setup_logging()時,它會根據代碼運行的位置選擇正確的處理程序,這意味着您不需要自己管理處理程序。 使用它可以看到我的日志消息在本地開發和部署為 Cloud Function 時在 Cloud Logging 中正確發送和解釋。

缺少的一件事是在本地開發時在控制台中查看日志消息的方法。 因此,我將代碼修改為:

import logging

client = google.cloud.logging.Client()
client.setup_logging()

log = logging.getLogger()

if __name__ == '__main__':
    # Add a stream handler to log messages to the console.
    stream_handler = logging.StreamHandler()
    stream_handler.setLevel(logging.INFO)
    log.addHandler(stream_handler)

它使用推薦的setup_logging()方法,同時還包括用於本地開發的 stream 處理程序。 因為if __name__ == '__main__':在雲 Function 環境中永遠不會成立,所以它為放置僅適用於本地開發的東西提供了一個安全的地方。 這也可以看到我的日志消息也輸出到控制台。

需要注意的一點是 stream 處理程序不支持結構化的 JSON 日志消息,因此它只會 output 結構化日志消息的消息部分(純文本)。 就我而言,這不是問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM