Я включил ротацию журналов в каталоге Springboot, и она работает, но я вижу, что «content-data-svc.log» на самом деле имеет размер 2 МБ, но когда я выполняю команду ls -ltrh, он отображается как 61 МБ.
если я просматриваю файл журнала, в нем больше пустых строк, что приводит к увеличению размера файла. 50% файла журнала занимают пустое место, а остальное — записи журнала. Есть идеи, почему это происходит?
[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
Ниже приведены мои записи logrotate:
[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
}
решение1
Причина того, что файл выглядит большим в выводе, ls
но маленьким в выводе du
, и что в начале файла после поворота появляется пустое место, заключается в том, что любая программа, которая записывает данные в файл журнала,нетоткрытие файла для «добавления».
При ротации файла журнала с copytruncate
установленной опцией в logrotate
файле конфигурации создается копия файла, а исходный файлусеченный. При усечении файла его содержимое фактически удаляется, но сам файл не удаляется.
Обычно программа открыла бы файл для добавления. Это означает, что каждая новая запись в журнал происходит вконецфайла, всегда. Когда файл обрезается, это означает, что следующая строка журнала будет записана в начале файла, потому что там же в этой точке находится и конец.
Однако, если программане имеетоткрыл файл в режиме добавления, следующая запись будет произведена по тому смещению в файле, на котором завершилась предыдущая запись, независимо от того, был ли файл усечен или нет.
Если файл был усечен logrotate
, это означает, что запись создает дыру в файле между началом и точкой, где происходит запись. Эта дыра заполнена нулевыми байтами, которые редактор vi
показывает как ^@
.
Именно это и происходит в вашем случае.
Файл с такой дырой называется «разреженным» файлом. Нулевые байты в самой дыре на самом деле не хранятся на диске, поэтому и du
показывает довольно маленький размер, но если вы прочитаете файл от начала до конца, вы прочтете 61 МБ данных (логический размер файла, который и ls
показывается).
Чтобы решить эту проблему, либо
- перепишите программу, которая записывает данные в файл журнала, так, чтобы она открывала файл в режиме добавления, или
- скажите программеповторно открытьфайл журнала при ротации файла (обычно это делается путем отправки программе сигнала
HUP
отlogrotate
, но вам следует прочитать руководство по вашей программе), или - перезапустите программу с
logrotate
момента ротации журнала.