有没有办法向 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 响应的真实有效负载中

GitHub 电子书和自定义有效负载

如何使用 Charles 代理修改 json 有效负载请求并添加新的 json 参数

有没有办法实时从UDP数据包中提取有效负载并将该有效负载用于其他应用程序?

C# Google API - 收到无效的 JSON 有效负载