Управление логами с помощью logrotate на Ubuntu 16.04

Настройка logrotate для управления системными и прикладными журналами.

Logrotate — системная утилита для автоматической ротации, сжатия и удаления лог-файлов. Без неё логи на работающем сервере могут со временем занять всё доступное дисковое пространство.

На Ubuntu 16.04 logrotate установлен по умолчанию и настроен для обработки журналов всех системных пакетов и приложений.

Проверка установки

logrotate --version

Вывод команды:

logrotate 3.8.7

Структура конфигурации

Конфигурация logrotate хранится в двух местах:

  • /etc/logrotate.conf — основной файл с глобальными параметрами по умолчанию и шаблонами для несистемных файлов
  • /etc/logrotate.d/ — каталог с отдельными конфигурациями для конкретных сервисов и приложений

Пример конфигурации для пакетного менеджера APT:

cat /etc/logrotate.d/apt

Вывод:

/var/log/apt/term.log {
rotate 12
monthly
compress
missingok
notifempty
}
/var/log/apt/history.log {
rotate 12
monthly
compress
missingok
notifempty
}

Файл содержит два блока — для term.log и history.log. Параметры, не указанные явно, наследуются из /etc/logrotate.conf.

Описание директив:

  • rotate 12 — хранить последние 12 архивных копий лога
  • monthly — выполнять ротацию раз в месяц
  • compress — сжимать архивы (по умолчанию — gzip)
  • missingok — не выдавать ошибку, если лог-файл отсутствует
  • notifempty — не ротировать пустые файлы

Способ 1. Конфигурация в /etc/logrotate.d/

Этот вариант запускается ежедневно от имени root вместе со всеми стандартными задачами logrotate.

Примера настройки ротации для приложения, которое пишет access.log и error.log в каталог /var/log/example-app/:

sudo nano /etc/logrotate.d/example-app
/var/log/example-app/*.log {
daily
missingok
rotate 14
compress
notifempty
create 0640 www-data www-data
sharedscripts
postrotate
systemctl reload example-app
endscript
}

Описание директив:

  • create 0640 www-data www-data — создавать новый пустой файл после ротации с правами 0640, владельцем и группой www-data
  • sharedscripts — скрипты из блока postrotate выполняются один раз после обработки всех файлов, а не для каждого отдельно
  • postrotate ... endscript — блок команд, выполняемых после ротации; в примере перезагружается приложение

После настройки проверьте конфигурацию в режиме отладки:

sudo logrotate /etc/logrotate.conf --debug

Команда выведет подробную информацию о том, какие файлы обрабатывает logrotate, без реального применения изменений.

Наши услуги и сервисы

ХостингРаботает на сверхбыстрых NVMe дисках. Подходит для сайтов любой сложности.
Заказать
VPSМожно динамически менять параметры и гибко настраивать ОС. Бесплатное администрирование включено.
Заказать
Выделенные серверыДоступны различные сборки на базе Supermicro с процессорами Intel и AMD на борту.
Заказать

Способ 2. Пользовательская конфигурация с запуском через cron

Этот вариант подходит, если нужна нестандартная периодичность — например, ежечасная ротация. В таком случае конфигурацию размещают за пределами /etc/logrotate.d/ и запускают вручную через cron.

Допустим, приложение работает под пользователем newuser и пишет логи в /home/newuser/logs/. Создайте конфигурационный файл:

nano /home/newuser/logrotate.conf
/home/newuser/logs/*.log {
hourly
missingok
rotate 24
compress
create
}

Эта конфигурация будет ежечасно ротировать файлы, сохраняя 24 архивные копии и создавая новый файл журнала взамен повёрнутого.

Создайте тестовый файл журнала:

cd ~
mkdir logs
touch logs/access.log

Запустите logrotate вручную с указанием файла состояния:

logrotate /home/newuser/logrotate.conf --state /home/newuser/logrotate-state --verbose --force

Вывод:

reading config file /home/newuser/logrotate.conf
Handling 1 logs
rotating pattern: /home/newuser/logs/*.log  hourly (24 rotations)
empty log files are rotated, old logs are removed
considering log /home/newuser/logs/access.log
log does not need rotating

--verbose — выводит подробный лог выполнения. --force — принудительно выполняет ротацию, даже если она ещё не нужна по расписанию. --state — указывает, где хранить информацию о последней ротации.

Проверьте содержимое файла состояния:

cat /home/newuser/logrotate-state

Вывод:

logrotate state -- version 2
"/home/newuser/logs/access.log" 2020-05-18-16:0:0

Logrotate фиксирует, когда и какие журналы он последний раз обрабатывал. При следующем запуске через час файл будет ротирован в штатном режиме.

Автоматизация через cron

Чтобы ротация выполнялась автоматически каждый час, добавьте задание в cron:

crontab -e

Добавьте в конец файла:

14 * * * * /usr/sbin/logrotate /home/newuser/logrotate.conf --state /home/newuser/logrotate-state

Задача будет запускаться на 14-й минуте каждого часа ежедневно.

Помощь

Если у вас возникли вопросы или требуется помощь, пожалуйста, свяжитесь с нами через систему тикетов — мы обязательно вам поможем!

Нужна помощь?Наши инженеры бесплатно помогут с любым вопросом за считанные минутыНаписать нам