Назад | Перейти на главную страницу

Logrotate Успешно, исходный файл возвращается к исходному размеру

Были ли у кого-нибудь проблемы с logrotate до того, как это заставило файл журнала повернуться, а затем вернуться к тому же размеру, который был изначально? Вот мои выводы:

Скрипт Logrotate:

/var/log/mylogfile.log {
    rotate 7
    daily
    compress
    olddir /log_archives
    missingok
    notifempty
    copytruncate
}

Подробный вывод Logrotate:

copying /var/log/mylogfile.log to /log_archives/mylogfile.log.1
truncating /var/log/mylogfile.log
compressing log with: /bin/gzip
removing old log /log_archives/mylogfile.log.8.gz

Файл журнала после усечения

[root@server ~]# ls -lh /var/log/mylogfile.log
-rw-rw-r--  1 part1 part1 0 Jan 11 17:32 /var/log/mylogfile.log

Буквально через секунды:

[root@server ~]# ls -lh /var/log/mylogfile.log
-rw-rw-r--  1 part1 part1 3.5G Jan 11 17:32 /var/log/mylogfile.log

Версия RHEL:

[root@server ~]# cat /etc/redhat-release 
Red Hat Enterprise Linux ES release 4 (Nahant Update 4)

Версия Logrotate:

[root@DAA21529WWW370 ~]# rpm -qa | grep logrotate
logrotate-3.7.1-10.RHEL4

Несколько заметок:

Вероятно, это связано с тем, что, даже если вы усекаете файл, процесс записи в файл будет продолжать запись с каким бы смещением оно ни было в конце. Итак, что происходит, logrotate обрезает файл, размер равен нулю, процесс снова записывает в файл, продолжая с того смещения, на котором он остановился, и теперь у вас есть файл с NULL-байтами до точки, в которой вы его усекли, плюс новый записи, записанные в журнал.

od -c после усечения + внезапное увеличение, сгенерированный вывод по строкам:

0000000  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
33255657600  \0   C   K   B   -   s   e   r   v   e   r       [   h   t   t
33255657620 <more log output>

Это говорит о том, что от смещения 0 до 33255657600 ваш файл состоит из нулевых байтов, а затем некоторых разборчивых данных. Достижение этого состояния не займет столько же времени, сколько потребовалось бы для фактической записи всех этих нулевых байтов. Файловые системы ext {2,3,4} поддерживают так называемые разреженные файлы, поэтому, если вы просматриваете область файла, которая ничего не содержит, эта область будет считаться содержащей нулевые байты и не будет занимать место. на диске. Эти нулевые байты на самом деле не будут записаны, просто предполагается, что они там есть, поэтому время, необходимое для перехода от 0 до 3,5 ГБ, не займет много времени. (Вы можете проверить, сколько времени потребуется, выполнив что-нибудь вроде dd if=${HOME}/.bashrc of=largefile.bin seek=3432343264 bs=1, это должно создать файл размером более 3 ГБ за несколько миллисекунд).

Если ты бежишь ls -ls в ваших лог-файлах после того, как они были усечены и снова внезапно увеличились, теперь он должен сообщать число в начале строки, которое представляет фактический размер (в блоках, занятых на диске), который, вероятно, на порядки меньше, чем размер сообщил только ls -l.

я чрезвычайно уверен, что Кьетил попал в нее. Дрю, возможно, вас еще не убедили его объяснения, но я призываю вас внимательно прочитать то, что он сказал.

Если вы принимаете это, исправление заключается в том, чтобы либо остановить и перезапустить приложение при ротации журналов, либо использовать такой инструмент, как apache "rotatelogs", где вы передаете выходные данные в инструмент через канал, а инструмент позаботится о время от времени ротация файла журнала. Например, один из моих экземпляров apache регистрирует

ErrorLog "|/usr/sbin/rotatelogs /www/logs/error_log 604800"

что приводит к появлению большого количества файлов журнала с такими именами, как

-rw-r--r--    1 root     root         4078 Dec 21 01:04 error_log.1292457600
-rw-r--r--    1 root     root         4472 Dec 29 08:41 error_log.1293062400
-rw-r--r--    1 root     root        78630 Jan  4 12:57 error_log.1293667200
-rw-r--r--    1 root     root        15753 Jan 12 01:10 error_log.1294272000

появиться без перезапуска apache; После этого я могу сжать их вручную. Обратите внимание, как ротация выполняется каждую неделю, то есть каждые 604800 секунд, это аргумент, переданный в rotatelogs.

Если вы не можете остановить и перезапустить приложение, и оно не может войти через канал, то я думаю, у вас настоящая проблема. Возможно, у других появятся предложения.

Было бы здорово, если бы вы могли отправить весь логротат.

Зачем пытаться использовать kill -HUP? (Классическая перезарядка не перезапускается) метод.

Также ... уточняйте у lsof кто обращается к файлу.

Просто используйте ">>", что означает "добавить", а не ">", что означает создание из ваших сценариев, которые пишут в этот файл. У меня была такая же проблема, и я исправил ее с помощью добавления в свой сценарий.

SomeScript.sh >> output.txt

Надеюсь, что это яснее.