Файл логротации Linux показывает неправильный размер, чем обычно

Файл логротации Linux показывает неправильный размер, чем обычно

Я включил ротацию журналов в каталоге 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показывается).

Чтобы решить эту проблему, либо

  1. перепишите программу, которая записывает данные в файл журнала, так, чтобы она открывала файл в режиме добавления, или
  2. скажите программеповторно открытьфайл журнала при ротации файла (обычно это делается путем отправки программе сигнала HUPот logrotate, но вам следует прочитать руководство по вашей программе), или
  3. перезапустите программу с logrotateмомента ротации журнала.

Связанный контент