有没有办法向 GCP 提供记录 JSON 有效负载的数据,以便它从有效负载中获取级别和时间戳?
Posted
技术标签:
【中文标题】有没有办法向 GCP 提供记录 JSON 有效负载的数据,以便它从有效负载中获取级别和时间戳?【英文标题】:Is there a way to feed GCP logging a JSON payload such that it grabs the level and timestamp from the payload? 【发布时间】:2021-04-14 10:54:05 【问题描述】:我正在创建一个日志接收器,它将接收另一个 go 程序的日志输出,进行一些过滤,然后直接 POST 到 GCP 日志记录。收到的日志是纯 JSON 条目。如果可以的话,我宁愿避免使用 JSON 编组。仅将 JSON 作为 JSON 有效负载添加到日志条目不会获取级别 --> 严重性或时间戳。我可以强制输入严重性,但我对时间戳的尝试失败了。然而,最好的情况是有一个 JSON 字符串和一点点配置,上面写着 find Severity in level 并使用时间戳字段。这是我的最小示例:
package main
import (
"context"
"encoding/json"
"fmt"
"log"
"time"
"cloud.google.com/go/logging"
)
func main()
ctx := context.Background()
projectID := "redacted1"
client, err := logging.NewClient(ctx, projectID)
if err != nil
log.Fatalf("Failed to create client: %v", err)
logName := "redacted2"
logger := client.Logger(logName)
// JSON string
text := "\"decision_id\":\"21986d12-e3b2-47f3-b3c7-9a8d77bd048d\",\"input\":\"networks\":[\"id\":\"net1\",\"public\":false,\"id\":\"net2\",\"public\":false,\"id\":\"net3\",\"public\":true,\"id\":\"net4\",\"public\":true],\"ports\":[\"id\":\"p1\",\"network\":\"net1\",\"id\":\"p2\",\"network\":\"net3\",\"id\":\"p3\",\"network\":\"net2\"],\"servers\":[\"id\":\"app\",\"ports\":[\"p1\",\"p2\",\"p3\"],\"protocols\":[\"https\",\"ssh\"],\"id\":\"db\",\"ports\":[\"p3\"],\"protocols\":[\"mysql\"],\"id\":\"cache\",\"ports\":[\"p3\"],\"protocols\":[\"memcache\"],\"id\":\"ci\",\"ports\":[\"p1\",\"p2\"],\"protocols\":[\"http\"],\"id\":\"busybox\",\"ports\":[\"p1\"],\"protocols\":[\"telnet\"]],\"labels\":\"id\":\"d29ba0a9-75d4-4d74-9d03-7bf0399a47c3\",\"version\":\"0.23.2\",\"level\":\"info\",\"metrics\":\"counter_server_query_cache_hit\":0,\"timer_rego_input_parse_ns\":554348,\"timer_rego_query_compile_ns\":484825,\"timer_rego_query_eval_ns\":1002441,\"timer_rego_query_parse_ns\":46624,\"timer_server_handler_ns\":2290410,\"msg\":\"Decision Log\",\"path\":\"example/violation\",\"requested_by\":\"127.0.0.1:44934\",\"result\":[\"ci\",\"busybox\"],\"time\":\"2021-01-04T08:44:24-06:00\",\"timestamp\":\"2021-01-04T14:44:24.215618442Z\",\"type\":\"openpolicyagent.org/decision_logs\""
sev := logging.Info
tim, err := time.Parse(time.RFC3339Nano, "2021-01-04T14:44:24.215618442Z")
if err != nil
log.Fatalf("Failed to parse time: %v", err)
entry := logging.EntryPayload: json.RawMessage([]byte(text)), Severity: sev,
Timestamp: tim
err = logger.LogSync(ctx, entry)
if err != nil
log.Fatalf("Failed to flush client: %v", err)
err = client.Close()
if err != nil
log.Fatalf("Failed to close client: %v", err)
【问题讨论】:
【参考方案1】:怎么样:
sev := logging.Info
if strings.Contains("\"level\":\"info\"", text)
sev = logging.Info
else if strings.Contains("\"level\":\"debug\"", text)
sev = logging.Debug
但你可能最终想要跑步
tokens := strings.Split(text, ":")
首先只在文本上搜索一次,然后搜索数组?不管怎样,你切片它,你想要来自那个字符串的数据,但你不想解组它。
【讨论】:
感谢@Andrew。这就是我所决定的,尽我所能。 我唯一的另一个想法是,如果您在不同的端口上运行这些日志收集器中的 N 个并说端口 3001 是 INFO 而 3002 是 DEBUG 等,然后检查正在发送的东西中的级别怎么办json。 (也可以将时间戳添加到具有已知字符数的字符串前面,并假设前 N 个字符不是 json,而是这个时间戳。)以上是关于有没有办法向 GCP 提供记录 JSON 有效负载的数据,以便它从有效负载中获取级别和时间戳?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Hystrix Feign 记录请求和响应 json 有效负载
如何向 Moya.Response JSON 添加一个字段,该字段不在来自 http 响应的真实有效负载中
如何使用 Charles 代理修改 json 有效负载请求并添加新的 json 参数