Использование logrotate в Linux
Использование logrotate
logrotate не работает как служба, поэтому нет необходимости в ее запуске или перезагрузке
Ротация логов настраивается в отдельных файлах, расположенных по пути /etc/logrotate.d/
Параметры
/var/log/nginx/*.log - это путь к файлу, который нужно ротировать
rotate N - Хранить последние N ротированных файлов. Остальные удалять.
maxage - выполнять ротацию журнала, если дата модификации файла старше, чем указано в директиве
copytruncate - сначала создается копия файла лога, после уже обрезается действующий. Необходимо, когда программа должна писать лог непрерывно. Однако здесь есть 2 минуса: долгое выполнение при больших объемах и вероятность потерять небольшое число записей
size=xM - Пока размер лог-файла не превысит x мегабайт, он не будет ротироваться
missingok - Если файла не существует, не выкидывать ошибку
notifempty - Если файл пустой, не выполнять никаких действий
daily - Делать ротацию каждый день
olddir - перемещать старые логи в отдельную папку
dateext - добавляет дату ротации перед заголовком старого лога
compress - Сжимать ротированные файлы
delaycompress - Сжимать только предыдущий журнал. Позволяет избежать ошибок, связанных с отсутствием доступа к используемому файлу
prerotate ... endscript - Скрипт, который необходимо выполнить перед чисткой лога
postrotate ... endscript - Скрипт, который необходимо выполнить после чистки лога
sharedscripts - Если мы указали выполнить ротацию для нескольких файлов (например, при помощи *), скрипт prerotate/postrotate будет выполняться для каждого из них. Данная опция указывает, что скрипт нужно выполнить один раз после завершения ротации всех файлов.
После настройки необходимо проверять работу сервиса после ротации лога. Некоторые службы могут перестать работать без лог-файла. В таком случае необходимо создавать новый (create). Также, в некоторых случаях, сервис необходимо перезапускать, так как при создании нового файла меняется его дескриптор.
Можно разово запустить ротацию, а также настроить автозапуск
Принудительный запуск выполняется со следующим синтаксисом:
logrotate -f путь к файлу конфигурации
Пример:
logrotate -f /etc/logrotate.d/nginx
Задание на автоматический запуск создается по умолчанию в файле /etc/cron.daily/logrotate, но стоит проверить
Если для какого-то приложения необходимо выполнять ротацию лога по особому расписанию
which logrotate
Получив путь, создаем правило в cron:
0 0 * * * /usr/sbin/logrotate /etc/logrotate.d/nginx
или запуск логов для всех служб:
0 0 * * * /usr/sbin/logrotate /etc/logrotate.conf
Источник: https://www.dmosk.ru/miniinstruktions.php?mini=logrotate-linux
Примеры настроек logrotate: https://www.dmosk.ru/miniinstruktions.php?mini=logrotate-example
Проверка работы logrotate
Выполнение ротации лог файлов зависит не только от размера или даты модификации лог-файла, также учитывается дата последней проверки состояния лог файла, которая записывается в файл: /var/lib/logrotate.status
Поэтому перед пробным запуском logrotate, кроме размера файла или его даты модификации, необходимо изменить дату проверки состояния
В следующем примере используется опция -v для подробного вывода работы утилиты logrotate
Можно также использовать опцию -d (debbug), которая позволяет увидеть результат без выполнения каких либо изменений (ротации)
vim /var/lib/logrotate.status
touch -mad "2025-03-13 12:15:25" error.log; touch -mad "2025-03-13 12:15:25" access.log; logrotate -v /etc/logrotate.d/nginx
Пример ротации логов nginx
sudo mkdir -p /var/log/nginx/old_log
sudo chown -R www-data:root /var/log/nginx
/var/log/nginx/*.log {
rotate 40
missingok
compress
delaycompress
notifempty
sharedscripts
daily
create 0644 www-data root
dateext
olddir /var/log/nginx/old_log
postrotate
/etc/init.d/nginx --quiet --ifstarted reopen
endscript
}
#Запись в cron
0 2 * * * /usr/sbin/logrotate /etc/logrotate.d/nginx
Пример ротации логов postgresql
sudo mkdir -p /var/log/postgresql/old_log
sudo chown -R postgres:postgres /var/log/postgresql
sudo chmod -R 600 /var/log/postgresql/old_log
#/etc/logrotate.d/postgresql
/var/log/postgresql/*.log {
rotate 100
size=300M
missingok
compress
delaycompress
copytruncate
notifempty
sharedscripts
daily
create 0600 postgres postgres
dateext
olddir /var/log/postgresql/old_log
}
#Запись в cron
0 2 * * * /usr/sbin/logrotate /etc/logrotate.d/nginx
0 2 * * * /usr/sbin/logrotate /etc/logrotate.d/postgresql