После запуска 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
}