美化流日志中的 json

rxy*_*xyz 1 bash logging json sed jq

我正在尝试美化 aws 日志流

日志格式:

2022-09-07T17:14:35.987000+00:00 2022/09/07/[$LATEST]58f517bs4ebcsae033sd953bs734224 {"cold_start":true,"function_memory_size":512,"function_request_id":"a2cfdd5d-4b0b-4cfa-97c2-4af9ba6a1056","level":"ERROR","message":"Unexpected","sampling_rate":1,"timestamp":"2022-09-07T17:14:35.987Z","xray_trace_id":"1-6318d178-0e96c13a1399a74b4f353edd","extra":"{\"error\":\"AccessDeniedException: User: arn:aws:sts::\",\"stack\":\"AccessDeniedException: User: arn:aws:sts::\"}"}
Run Code Online (Sandbox Code Playgroud)

我想将其更改为

2022-09-07T17:14:35.987000+00:00 2022/09/07/[$LATEST]58f51004277b4ebcae033d953b734224 {
  "cold_start": true,
  "function_memory_size": 512,
  "function_request_id": "a2cfdd5d-4b0b-4cfa-97c2-4af9ba6a1056",
  "level": "ERROR",
  "message": "Unexpected",
  "sampling_rate": 1,
  "timestamp": "2022-09-07T17:14:35.987Z",
  "xray_trace_id": "1-6318d178-0e96c13a1399a74b4f353edd",
  "extra": '{"error":"AccessDeniedException: User: arn:aws:sts::","stack":"AccessDeniedException: User: arn:aws:sts::"}',
}
Run Code Online (Sandbox Code Playgroud)

我试过这个

aws logs tail /aws/lambda/lambda-name | sed -u -e "s/\({.*}\)/$(echo \'\\1\' | jq)/"
Run Code Online (Sandbox Code Playgroud)

但我收到这个错误

parse error: Invalid numeric literal at line 2, column 0
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?

pea*_*eak 5

如果您将日志样本提供给:

jq -rR 'index("{") as $ix | .[0:$ix], ( .[$ix:]|fromjson)'
Run Code Online (Sandbox Code Playgroud)

您将获得日志戳,后跟相应有效 JSON 的副本。

您的主题行表明您想要“美化”JSON 而不是破坏它,所以我假设您不打算后者。

如果您确实希望初始的“{”与日志标记一起出现,那么假设是 bash 或类似 bash 的 shell,您可以将上述内容通过管道传输到:

    sed $'/^[0-9][0-9][0-9][0-9]-/ {N; s/\\n{/{/; }'
Run Code Online (Sandbox Code Playgroud)