Архивация (ротация) логов Rails-приложения при помощи logrotate

Rotate logs for Rails app

После запуска Rails-приложений полезно настроить автоматическую архивацию (ротацию) файлов журналов (лог-файлов), так как они имеют обыкновение крайне быстро разрастаться до весьма объемных размеров:

$ ls -lh log/production.log
  -rw-rw-r-- 1 www-data www-data 193,2M feb 20 17:49 production.log

Найти что-либо в 200-мегабайтном файле не очень просто ;)

Для ротации логов можно использовать стандартный интструмент logrotate. Если его нет в системе, то в случае Debian или Ubuntu его можно просто установить командой:

sudo apt-get install logrotate

Пример настройки logrotate

Создаём файл конфигурации logrotate для Rails-приложения /etc/logrotate.d/rails_example_com (настройки для нескольких приложений можно хранить в одном файле, но более правильно использовать по одному файлу на приложение). Содержание файла должно быть примерно такое:


/path/to/rails/app/log/*.log {
  daily
  missingok
  rotate 7
  compress
  delaycompress
  notifempty
  copytruncate
}

Параметры

  • daily – проводить архивацию ежедневно, также, можно выбрать еженедельно (weekly) или ежемесячно (monthly);
  • missingok – в случае отсутствия лог-файла, игнорировать его;
  • rotate 7 – хранить логи за последние 7 дней;
  • compress – сжимать (при помощи gzip) архивный файл;
  • delaycompress – архивировать, а на следующий день сжимать архивный файл;
  • notifempty – не проводить ротацию, если файл лога пуст;
  • copytruncate – копировать содержимое лог-файл, а затем делать его пустым; таким образом файл всё время доступен на запись для Rails-приложения, если не использовать этот параметр, то необходимо останавливать приложение на время архивации лог-файла.

Запуск

Для проверки работы можно запустить logrotate с параметром -d (отладка), благодаря которому logrotate покажет, как он будет работать, но ничего не изменит:

sudo logrotate -d /etc/logrotate.d/rails_example_com

Если logrotate в тестовом режиме отработал без ошибок, то можно ждать, когда он отработает автоматически на следующие сутки или запусить его вручную:

sudo logrotate -f /etc/logrotate.d/rails_example_com

Также, можно второй раз вручную запустить logrotate, чтобы убедиться, что опция delaycompress работает, результатом двух запусков logrotate должно быть следующее:

ls
production.log production.log.1 production.log.2.gz

Что мы видим: * production.log остался на месте, пуст и доступен для записи для приложения; * production.log.1 — копия логов между первым и вторым запуском logrotate; * production.log.2.gz — сжатый лог за всё предыдущее время.

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

Ещё один вариант настроек

В предложенном ниже файле настройки для хранения журналов за последний год с еженедельной архивацией:


/path/to/rails.example.com/tmp/log/*.log {
    weekly
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    copytruncate
}