Kann ich ein „tail -f“ mit gemischten Daten, die JSONs enthalten, an jq weiterleiten, um JSONs zu visualisieren?

Kann ich ein „tail -f“ mit gemischten Daten, die JSONs enthalten, an jq weiterleiten, um JSONs zu visualisieren?

Ich habe eine Weile herumgespielt und recherchiert, aber ich kann keine Lösung finden. Ich habe einige riesige Protokolle, in denen manchmal auch riesige JSONS enthalten sind. Aber zur Vereinfachung stellen Sie sich Folgendes vor:

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 '.'

Ist es möglich, so etwas anzuzeigen (das JSON als Ausgabe von jq '.' wäre):

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"
}

Erkennen Sie also beim Drucken des Protokolls die JSON-Dateien automatisch und zeigen Sie sie so an, wie die Ausgabe aussehen würde:

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

Antwort1

Das Folgende hat für Ihr Beispiel funktioniert und erscheint mir sinnvoll. Ich iteriere über jede Zeile in der Protokolldatei und wenn eine Zeile mit dem regulären Ausdruck „{.*}“ übereinstimmt, wird sie als JSON-Objekt identifiziert und dann mit jq formatiert. Wenn der reguläre Ausdruck jedoch nicht übereinstimmt, wird es normal ausgedruckt. Ich habe es getestet, es funktioniert tatsächlich auch für größere, komplexere Dateien sehr gut.

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

verwandte Informationen