我可以将包含 JSON 的混合数据的“tail -f”传输到 jq 来可视化 JSON 吗?

我可以将包含 JSON 的混合数据的“tail -f”传输到 jq 来可视化 JSON 吗?

我玩了一段时间并进行了研究,但还是找不到解决方案。我有一些巨大的日志,有时还有巨大的 JSONS。但为了简化,想象一下以下内容:

mkdir logs
cd logs/
echo "$(date) [INFO] something" >> huge_log.log
echo "$(date) [INFO] something more" >> huge_log.log
echo "$(date) [INFO] Something with json: {\"foo\": \"bar\"}" >> huge_log.log
tail -n 5 -f huge_log.log | how_to_filter? | jq '.'

是否可以看到类似这样的内容(jq'.'输出的 json 将是):

Tue Aug 18 12:42:24 CEST 2020 [INFO] something
Tue Aug 18 12:42:29 CEST 2020 [INFO] something more
Tue Aug 18 12:43:05 CEST 2020 [INFO] Something with json: 
{
    "foo": "bar"
}

因此,以某种方式,在打印日志时自动检测 json 并将它们显示为输出:

echo "{\"foo\": \"bar\"}" | jq '.'
{
  "foo": "bar"
}

答案1

下面的方法适用于您的示例,并且对我来说似乎很合理。我遍历日志文件中的每一行,如果一行与正则表达式“{.*}”匹配,则将其标识为 json 对象,然后使用 jq 进行格式化。但是,如果正则表达式不匹配,则会打印出正常内容。我测试了它,它实际上对更大更复杂的文件也非常有效。

tail -n 15 huge_log.log | while read line ; do if echo $line | egrep "\{.*}" >/dev/null;json=$(echo $line | egrep -oh "\{.*}" | jq '.');then echo $line | awk -v json="$json" -F "\{.*}" '{printf "%s\n%s\n%s\n",$1,json,$2}'; fi;  done

相关内容