Я пытаюсь отслеживать файл журнала, который часто ротируется с помощью logrotate, но не могу сделать это правильно. Может ли кто-нибудь объяснить, как на самом деле работает logrotate?
Переименовывается ли файл и создается ли новый файл?
или файл копируется с новым именем, а текущий файл очищается?
Перед вращением:
131887 -rw-r--r-- 1 root root 11385 Sep 25 03:40 /var/log/sas.log
После вращения:
131887 -rw-r--r-- 1 root root 0 Sep 25 04:40 /var/log/sas.log
131911 -rw-r--r-- 1 root root 11385 Sep 25 04:40 /var/log/sas.log.1
решение1
Если опция truncate включена в файле конфигурации, то файл не будет перемещен - его содержимое будет только скопировано в другой файл, который будет создан заново, а текущий файл будет очищен, поэтому идентификатор inode не изменится. Фактически файл никогда не изменяется.
решение2
При ротации текущий файл журнала перемещается и, возможно, сжимается, если это указано. Затем он создается заново. [ищу источник, отличный от моего опыта]
Это проблема, если запущена служба, которая открыла файл журнала во время ротации. Файл будет отсоединен, но дисковое пространство на самом деле не освободится, поскольку файл все еще открыт.
Вот почему сервисы часто устанавливают более сложный скрипт logrotate, обрабатывающий ротацию. В качестве примера рассмотрим /etc/logrotate.d/nginx
определение поведения ротации для nginx
веб-сервера:
[....]
postrotate
invoke-rc.d nginx rotate >/dev/null 2>&1
endscript
Блок postrotate
выполняется после создания нового файла журнала. Он вызывает скрипт службы nginx, rotate
сообщая службеповторно открыть файл журнала.