Wie verarbeite ich eine Protokolldatei von tail -f in awk in jq?

Wie verarbeite ich eine Protokolldatei von tail -f in awk in jq?

Mein Anwendungsfall ist folgender: Ich habe ein Apache-Logfile, in dem ich nur JSON-Daten aus PHP protokolliere. Aufgrund der Art und Weise, wie Apache die Logs ausdruckt, muss ich den Anfang und das Ende jeder Zeile mit awk kürzen. Das Ergebnis ist ein JSON-String, den ich mit jq ausdrucken möchte.

Um von tail nach awk zu leiten, muss ich stdbuf verwenden. Der vollständige Befehl, den ich erstellt habe, lautet:

stdbuf -o0 tail -f  -n 1 /var/log/apache2/error.log | awk '{print substr($0,83, length($0)- 166); }' | jq 

das funktioniert nicht. Ich denke, es liegt an jq, aber --stream oder --unbuffered funktionieren auch nicht.

Weiß jemand, wie ich das mache, was ich will?

BEARBEITEN: Ein Beispiel für JSON wäre einfach:

{"foo": "bar"}

Dies wird korrekt angezeigt, aber wenn das JSON geschrieben wird, während Tail ausgeführt wird, wird es nicht angezeigt.

Antwort1

Ich habe gerade eine Lösung gefunden: Man muss jeden Befehl mit stdbuf -oO "entpuffern". Das sollte dann so aussehen:

stdbuf -o0 tail -f  -n 2 /var/log/apache2/error.log | stdbuf -o0 awk '{print substr($0,83, length($0)- 166); }' | jq

verwandte Informationen