Linux-Logrotationsdatei zeigt falsche Größe als üblich an

Linux-Logrotationsdatei zeigt falsche Größe als üblich an

Ich habe die Logrotation im Springboot-Verzeichnis aktiviert und sie funktioniert. Allerdings sehe ich, dass „content-data-svc.log“ eigentlich 2 MB groß ist, aber wenn ich „ls -ltrh“ ausführe, werden 61 MB angezeigt.

Wenn ich mir die Protokolldatei ansehe, sind darin mehr leere Zeilen, was die Dateigröße vergrößert. 50 % der Protokolldatei sind leer, der Rest sind Protokolleinträge. Irgendeine Idee, warum das so ist?

[aemelics@springboot]$ ls -ltrh
total 4.6M
-rw------- 1 aemelics aemelics 1.6M Apr 11 06:44 content-data-svc.log.2.gz
-rw------- 1 aemelics aemelics 1.1M Apr 12 00:44 content-data-svc.log.1.gz
-rw------- 1 aemelics aemelics  61M Apr 12 02:00 content-data-svc.log
[aemelics@springboot]$ du -shx content-data-svc.log
2.0M    content-data-svc.log

Unten sind meine Logrotate-Einträge:

[aemelics@springboot]$ cat /etc/logrotate.d/react

/logs/springboot/*.log*
{
su aemelics aemelics
    missingok
    daily
    minsize 20M
    copytruncate
    notifempty
    sharedscripts
    compress
    rotate 5
    postrotate
    endscript
}

Antwort1

Der Grund dafür, dass die Datei in der Ausgabe von groß, lsin der Ausgabe von jedoch klein aussieht duund dass nach der Rotation am Anfang der Datei leerer Platz zu sein scheint, liegt darin, dass das Programm, das in die Protokolldatei schreibt,nichtÖffnen der Datei zum „Anhängen“.

Wenn die Protokolldatei rotiert wird und die copytruncateentsprechende Option in der logrotateKonfigurationsdatei festgelegt ist, wird eine Kopie der Datei erstellt und die OriginaldateigekürztWenn eine Datei gekürzt wird, wird ihr Inhalt effektiv gelöscht, die Datei selbst wird jedoch nicht gelöscht.

Normalerweise würde ein Programm die Datei zum Anhängen öffnen. Das bedeutet, dass jeder neue Schreibvorgang in das Protokoll an derEndeder Datei, immer. Wenn die Datei abgeschnitten wird, bedeutet dies, dass die nächste Protokollzeile an den Anfang der Datei geschrieben wird, da dort an dieser Stelle auch das Ende ist.

Wenn das Programm jedochnichtWenn die Datei im Anfügemodus geöffnet wurde, erfolgt der nächste Schreibvorgang an den Offset in der Datei, an dem der letzte Schreibvorgang beendet wurde, unabhängig davon, ob die Datei abgeschnitten wurde oder nicht.

Wenn die Datei durch abgeschnitten wurde logrotate, bedeutet dies, dass beim Schreiben zwischen dem Start und dem Punkt, an dem der Schreibvorgang stattfindet, ein Loch in der Datei entsteht. Dieses Loch ist voller Nullbytes, die im viEditor als angezeigt werden ^@.

Dies ist in Ihrem Fall der Fall.

Eine Datei mit einem solchen Loch wird als „sparse“-Datei bezeichnet. Die Nullbytes im Loch selbst werden nicht wirklich auf der Festplatte gespeichert, weshalb dudie Größe recht klein ist. Wenn Sie die Datei jedoch von Anfang bis Ende lesen würden, würden Sie 61 MB Daten lesen (die logische Größe der Datei, die lsangezeigt wird).

Um dieses Problem zu lösen, entweder

  1. das Programm, das in die Logdatei schreibt, so umschreiben, dass es die Datei im Anfügemodus öffnet, oder
  2. sagen Sie dem Programm,wieder öffnendie Logdatei, wenn die Datei rotiert wird (das geschieht normalerweise, indem dem Programm ein HUPSignal von gesendet wird logrotate, aber Sie sollten das Handbuch Ihres Programms lesen), oder
  3. Starten Sie das Programm neu, logrotatewenn das Protokoll rotiert wird.

verwandte Informationen