我需要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:
作为撰写本文时的最新版本。
(或随意命名)
并使用以下命令调用 json 日志记录:
json_for_gcp_lbm = {MY_JSON_HERE}
这导致 jsonPayload 输出:
然后您可以在“创建日志指标”(基于日志的指标/LBM)菜单中从 json 中选择任何标签: