An komprimiertes Protokoll anhängen

463
Orient

Es gibt einige z-Dienstprogramme ( zless, zcat), die den Inhalt einer komprimierten Datei transparent lesen können.

Kann man eine komprimierte Protokolldatei anhängen (in beiden Formaten, nicht unbedingt in gzip)?

Ich möchte etwas wie das Folgende ( zteeist ein imaginärer Nutzen mit Funktionalität von Interesse):

echo "[ $( date ) ] message" | ztee -a file.log.gz 
1
Hast Du es versucht? Was war das Ergebnis? Seth vor 6 Jahren 0
@Seth was versucht? Orient vor 6 Jahren 0
Nun, Sie haben tatsächlich einen Befehl genau dort. Haben Sie versucht, es auszuführen, vorausgesetzt, "ztee" existiert? Werfen Sie auch einen Blick auf die [Manpage für Zless] (https://linux.die.net/man/1/zless), da Sie möglicherweise weitere Hinweise erhalten. Seth vor 6 Jahren 0
@Seth Wo habe ich befohlen? `ztee` existiert nicht. Ich weiß über "Zless" -Existenz Bescheid - wie kann es mir helfen, das Problem zu lösen? Wenn ich einen imaginären Pseudocode in der Shell starte, bekomme ich definitiv einen Fehler. Sicher. Sicher habe ich nicht versucht, es auszuführen. Die Annahme der Existenz eines "Ztees" gibt mir im wirklichen Leben nichts. Orient vor 6 Jahren 0
Sie haben es nicht klargestellt. Die Manpage zeigt Ihnen, was "zless" tatsächlich tut (mehr oder weniger ein Alias ​​für "gzip"). Grawity hat sich schon Zeit genommen, um zu erklären, was Sie tun können, und Sie haben es als Antwort akzeptiert. Die Manpage `gzip` hat Beispiele, die das gleiche tun. Seth vor 6 Jahren 0
@Seth und .... was? Sie haben gerade die Kleinigkeiten aufgelistet. Was willst du? Orient vor 6 Jahren 0
Ich gebe Ihnen Feedback, damit Sie in Zukunft weitere Fragen stellen können und warum ich die Manpage erwähnt habe. Seth vor 6 Jahren 0
@Seth Danke. Vielleicht das Problem (von mir) in der Sprachbarriere. Orient vor 6 Jahren 0

1 Antwort auf die Frage

3
grawity

Ja, aber es ist nutzlos.


Einige komprimierten Dateiformate - einschließlich denen, die von gzip, bzip2und xz- tun native Unterstützung Verkettung. ( Bei Verwendung von Low-Level-APIs ist möglicherweise eine explizite Anmeldung erforderlich. Dekomprimierer werden jedoch von Befehlszeilen-Dekompressoren standardmäßig akzeptiert.)

echo "test 1" | gzip >> log.txt.gz echo "test 2" | gzip >> log.txt.gz echo "test 3" | tee >(gzip >> log.txt.gz) echo "test 4" | (tee /dev/fd/3 | gzip >> log.txt.gz) 3>&1 zcat log.txt.gz 

(Beachten Sie, dass zB zcatbuchstäblich nur ein Shellscript-Wrapper für gunzip... ist)

Dies bedeutet jedoch, dass jede Protokollnachricht einzeln komprimiert wird, ohne den gesamten Inhalt zu berücksichtigen. Wenn Sie versuchen, viele kurze Protokollnachrichten zu verketten, sind die Kompressionsraten daher sehr, sehr schlecht. (Bei meinen Tests, die eine zufällige Protokolldatei auf diese Weise komprimieren, ist die resultierende Datei tatsächlich auf 120% ihrer ursprünglichen Größe angewachsen, da all diese wiederholten Kopfzeilen anfallen .)

$ dmesg > test.log $ cat test.log | gzip > test-single.log.gz $ cat test.log | while read -r line; do echo "$line" | gzip done > test-concat.log.gz $ du -h test* 500K test-concat.log.gz 416K test.log 64K test-single.log.gz 

Meines Wissens gibt es kein Tool, das das Laden der vorhandenen Header der vorhandenen komprimierten Datei unterstützt und zum Komprimieren neuer Daten verwendet. Um dies zu erreichen, müssen Sie einen permanenten gzipProzess ausführen und die Protokolle regelmäßig über stdin protokollieren. Zum Beispiel:

#!/bin/bash  # open a subprocess (the bash equivalent of 'popen') coproc LOG { gzip >> log.txt.gz; }  echo "doing stuff" >&$ echo "doing more stuff" >&$ echo "still doing stuff" >&$  # close its stdin to finish compression exec >&- 

In „Standard“ Shell, können Sie die gleichen mit Named Pipes erreichen, oder noch einfacher Umleiten das ganze Skript durch gzip. (Drucken Sie einfach dieselbe Nachricht einmal an stdout und einmal an stderr, und Sie haben Ihre tee.)


Weitere Informationen zur komprimierten Stream-Verkettung:

Mit minimalem Nutzen ist es daher erforderlich, die gesamte Datei erneut zu lesen. Ich möchte keinen Zwischenfortschritt bei einem versehentlichen Systemausfall verlieren. Orient vor 6 Jahren 0
Komprimieren Sie dann die aktiven Protokolle erst gar nicht. Je mehr Komplexität, desto wahrscheinlicher ist es, dass es versagt. grawity vor 6 Jahren 2
Schließlich kam ich zu den gleichen Schlussfolgerungen. Vielen Dank. Orient vor 6 Jahren 0