我可以透過管道將包含 JSON 的混合資料的「tail -f 」傳輸到 jq 來視覺化 JSON 嗎?

我可以透過管道將包含 JSON 的混合資料的「tail -f 」傳輸到 jq 來視覺化 JSON 嗎?

我已經玩了一段時間並進行了研究,但找不到解決方案。我有一些巨大的日誌,有時也有巨大的 JSON。但為了簡化起見,請想像以下內容:

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

相關內容