Behalten Sie die feste Größe der Protokolldatei ohne Logrotate bei


13

Gibt es eine Möglichkeit, die Dateigröße der Protokolldatei festzuhalten, ohne sie durch eine neue leere Datei zu drehen und die alte Datei zu löschen (oder zu archivieren)? Wenn ich zum Beispiel die maximale Größe der Protokolldatei auf 1 MB festlege, wird der Text nach dem Überschreiten dieser Grenze automatisch geklemmt, und der älteste Teil des Texts wird ausgegeben, um die Dateigröße von 1 MB beizubehalten .


benutze dann logrotaterm -f *.tar.gz.*
Marco Ceppi

1
Gibt es einen bestimmten Grund, warum Sie das Protokoll nicht drehen oder logrotate verwenden möchten? Was genau willst du passieren? Das alte Protokoll bei 1M archivieren und ein neues starten? Der Anfang Ihrer Frage ist nicht ganz mit dem Ende vereinbar.
David Thornley

Was bedeutet herausgesprungen ?
Tshepang

Antworten:


4

Sie könnten ein kleines Bash-Skript schreiben, um dies zu tun. Stellen Sie die Datei einfach auf eine bestimmte Anzahl von Bytes ein tail -cund überschreiben Sie die Datei.

von man tail:

-c, --bytes=N
              output the last N bytes; alternatively, use +N to  output  bytes
              starting with the Nth of each file

   If  the  first  character of N (the number of bytes or lines) is a `+',
   print beginning with the Nth item from the start of each  file,  other‐
   wise, print the last N items in the file.  N may have a multiplier suf‐
   fix:  b  512,  kB  1000,  K  1024,  MB  1000*1000,  M   1024*1024,   GB
   1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.

3
Ich bin mir relativ sicher, dass nach dem "Überschreiben" der Datei die Protokollierung für die neue Datei nicht automatisch fortgesetzt wird.
Stephen Jazdzewski

0

Möglicherweise besteht Ihre einzige Lösung darin, Ihr eigenes Userspace-Dateisystem zu schreiben oder zu einem vorhandenen beizutragen. Schauen Sie sich die Teilliste unter Dateisystem im Userspace an

Wenn Sie nicht die Fähigkeiten haben, einen Beitrag zu leisten, bieten Sie eine Projektwerbung oder $$$ oder beides an, um sie für Sie hinzuzufügen.

Ich wünschte, ich hätte die Zeit dazu, ich wollte immer genau so etwas.


0

Ähnliches können Sie mit einem FIFO tun, das einer Datei mit einer Größe von null Byte ähnelt.

Beachten Sie jedoch, dass der Syslog-Prozess möglicherweise blockiert wird und nicht mehr in ALLE Ihre Protokolldateien geschrieben wird, wenn diese Datei leer ist. Ich bin nicht sicher, ob dieses Verhalten mit neueren Versionen von Ubuntu / CentOS geändert wurde.

Ein Beispiel hier

Versuchen Sie es mit einem anderen Beispiel.

Machen Sie Ihren FIFO:

sudo mkfifo /var/log/everything.fifo

Und füge dies zu (r) syslog.conf hinzu und starte dann syslog neu:

*.*     |/var/log/everything.fifo

Dann schauen Sie sich das FIFO in einem Fenster an:

cat /var/log/everything.fifo

Und in einem anderen Fenster schicke ein paar Sachen an syslog:

logger Test1
logger Test2
logger Test3

Sie sollten die Zeilen "Test *" in der Ausgabe von catoben sehen.

Diese Funktion eignet sich hervorragend zum Debuggen, insbesondere wenn Sie die Daten nicht länger aufbewahren möchten. Wenn Sie beispielsweise nur alles außer Firewall-Spam anzeigen möchten, können Sie Folgendes tun:

grep -vi "kernel: .* on wan" /var/log/everything.fifo

0

Hier ist meine zweite Antwort. Das ist ziemlich hackisch.

Verwenden Sie watch (1), um wiederholt auszuführen tail --bytes=1024(die letzten 1024 Bytes der Protokolldatei, danke an @jjclarkson für diese Antwort).

watch --no-title tail --bytes=1024 /var/log/messages >/tmp/messages.watch

Und dann sehen Sie die Datei mit:

less --raw-control-chars /tmp/messages.watch

Der Unterschied zwischen watchund einer while-Schleife besteht darin, dass watch/tmp/messages.watch nur aktualisiert wird, wenn Änderungen an / var / log / messages vorgenommen wurden.

while true; do
    tail --bytes=1024 /var/log/messages > /tmp/messages.watch
    sleep 1
done

Und nun, ich denke, Sie könnten eine testwhile-Schleife einfügen, damit tail nur ausgeführt wird, wenn / var / log / messages aktualisiert wurde, aber ich werde das jetzt nicht herausfinden.


0
 * prune - schneidet den Anfang einer Liste von Dateien ab, die in der
 * Datei / etc / default / prune. Entwickelt, um regelmäßig ausgeführt zu werden
 * von cron ist die Idee, das Protokoll automatisch zu verkürzen
 * Dateien, die für immer wachsen. Diese Datei enthält eine Liste von
 * files (vollständiger Pfadname) und die Anzahl der Blöcke, die
 * sollte beibehalten werden. Um etwas Vernunft zu bewahren, kürzen Sie den Willen
 * Clip die Datei nach dem nächsten Zeilenumbruch. Die Datei
 * / etc / default / prune sollte ungefähr so ​​aussehen:
 *
 * / usr / adm / aculog 10
 * /usr/adm/leo.log 5
 * / usr / adm / messages 200
 * / usr / adm / sup_log 5
 *
 * Der crontab-Eintrag in infoswx für prune sieht folgendermaßen aus:
 *
 * 0 5 * * * / etc / prune> /usr/adm/prune.log 2> & 1
 *
 * Kompilieren Sie mit: cc -O -o prune prune.c
 *
 * Die folgenden Definitionen können an Ihren Geschmack angepasst werden
 * und die Blockgröße Ihres Systems.
 *
 * Ray Davis infoswx! Bienen 25.09.85

https://groups.google.com/group/mod.sources/browse_thread/thread/b2136b3ab7e924e/f785b37c218bb576?hl=de&ie=UTF-8&q=prune+log+file&pli=1

Viele (die meisten? Alle?) Daemons öffnen ihre Protokolldateien erneut, wenn ein HUP-Signal gesendet wird (z. B. von demselben Cron-Job, der prune ausführt).


0

Ich bin mir sicher, dass das Originalplakat nach 8 Jahren eine Lösung gefunden hat. Hier ist noch eine für andere, die diesen Thread lesen können ...

curtail begrenzt die Größe der Programmausgabe und behält die letzten 200 MB der Ausgabe mit dem folgenden Befehl bei:

run_program | verkürzen -s 200M myprogram.log

https://github.com/Comcast/Infinite-File-Curtailer

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.