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ß, ls
in der Ausgabe von jedoch klein aussieht du
und 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 copytruncate
entsprechende Option in der logrotate
Konfigurationsdatei 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 vi
Editor 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 du
die 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 ls
angezeigt wird).
Um dieses Problem zu lösen, entweder
- das Programm, das in die Logdatei schreibt, so umschreiben, dass es die Datei im Anfügemodus öffnet, oder
- sagen Sie dem Programm,wieder öffnendie Logdatei, wenn die Datei rotiert wird (das geschieht normalerweise, indem dem Programm ein
HUP
Signal von gesendet wirdlogrotate
, aber Sie sollten das Handbuch Ihres Programms lesen), oder - Starten Sie das Programm neu,
logrotate
wenn das Protokoll rotiert wird.