Как удалить файл журнала rails после определенного размера

У меня есть демон, который работает постоянно, что довольно быстро заполняет файл журнала (development.log или production.log). Каков наилучший способ удалить файл журнала после определенного размера или удалить часть до определенного дня.

Ответы

Ответ 1

Лучший способ - настроить вращение журнала, но как вы это делаете, зависит от платформы, поэтому вы должны добавить комментарий о том, что используете, как для разработки, так и для производства.

Для наших приложений, работающих в Linux, у нас есть файл /etc/logrotate.d/appname для каждого приложения, что выглядит примерно так:

/path/to/rails_root_for_app/log/production.log {
    daily
    missingok
    rotate 7
    compress
    delaycompress
    notifempty
    create 640 capistrano capistrano
}

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

Если вы просто хотите очистить файл, не сохраняя в нем какие-либо данные, пока демон просто выполните это из оболочки:

> /path/to/rails_root_for_app/log/development.log

Это сократит файл до 0 байтов.

Ответ 2

config.logger = Logger.new(config.log_path, 50, 1.megabyte)

но будьте осторожны, что у нескольких mongrels могут быть проблемы с этим.

Ответ 3

Я предпочитаю ежемесячный файл журнала в файле production.rb

config.logger = Logger.new(config.log_path, 'monthly')

Ответ 4

Или даже лучше, если все ваши среды находятся на Mac или Linux и имеют /usr/sbin/rotatelogs, просто используйте это. Он гораздо более гибкий и не имеет проблемы с потерей данных, которые имеют logrotate (даже если вы используете copytruncate).

Добавьте это внутри config/application.rb(или просто config/environment/production.rb, если вы хотите только поворот в prod):

log_pipe = IO.popen("/usr/sbin/rotatelogs #{Rails.root}/log/#{Rails.env}.%Y%m%d.log 86400", 'a')
config.logger = Logger.new(log_pipe)

(Из этот пост в блоге)

Ответ 5

Или вы можете делегировать регистрацию на syslog