Каков наилучший способ поворота журналов для приложения rails

У меня есть 1GB-фрагмент из slicehost, и у меня есть 4 проекта, работающих на этом поле. Все 4 приложения являются рубинами для применения в рельсах. Мне было интересно, что лучший способ гарантировать, что файлы журналов будут повернуты.

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

Я запускаю ubuntu.

Я бегу пассажира.

Ответы

Ответ 1

Я также использую logrotate (вам нужно будет установить через apt-get). Создайте новый файл logrotate в каталоге /etc/logrotate.d/. Вот пример одного из моих:

# for the rails logs
/home/apps/*/shared/log/*log {
  daily
  rotate 14
  notifempty
  missingok
  compress
  sharedscripts
  postrotate
    /usr/bin/touch /home/apps/application1/current/tmp/restart.txt
    /usr/bin/touch /home/apps/application2/current/tmp/restart.txt
  endscript
}
# for the apache logs
/home/apps/logs/*log {
  daily
  rotate 14
  notifempty
  missingok
  compress
  sharedscripts
  postrotate
    /etc/init.d/apache2 restart
  endscript
}

Это вращает журналы rails production.log и журналы доступа/ошибок apache (я запускаю приложения под пассажиром).

Ответ 2

Я бы просто использовал встроенное вращение, предлагаемое регистратором rails:

# in config/application.rb
config.logger = Logger.new(Rails.root.join('log', "#{Rails.env}.log"), 3, 10.megabytes)

Это приведет к вращению файлов журнала, когда они достигнут 10 МБ, и сохранит 3 последних опрошенных журнала.

Ответ 3

Это метапрограммирование и должно ли оно быть на ServerFault или SO дискуссивно.

logrotate, стандартный пакет для ряда операционных систем, и вы можете apt-get install logrotate получить его, если вы этого еще не сделали. Его можно принуждать к вращению любых журналов, которые вы хотите, используя любое расписание, которое вы хотите, и с различными политиками a la "gzip 7 дней, затем rm" для каждого файла.

Изучите /etc/logrotate.d.

Ответ 4

Здесь моя процедура установки capistrano. Я копирую его в файл развертывания и запускаю его, когда создаю серверную среду для приложения, или если есть какие-либо изменения в конфигурации logrotate.

namespace :setup do
  task :install_logrotation, :roles => :app do
    logrotate = <<-BASH 
      #{shared_path}/log/*.log {
        daily
        missingok
        rotate 30
        compress
        size 5M
        delaycompress
        sharedscripts
        postrotate
          #{signal_unicorn("USR1")}
        endscript
      }
    BASH
    tmpfile = "/tmp/#{application}.logrotate"

    put(logrotate, tmpfile)
    run "#{sudo} chown root:root #{tmpfile} && #{sudo} mv -f #{tmpfile} /etc/logrotate.d/#{application}"
  end
end

(О, и signal_unicorn просто выполняет "# {sudo} kill -s # {signal} cat #{unicorn_pid}"; USR1 сообщает ему перезагрузить все его файлы, чтобы он добавился к новому файлу журнала.)

Удачи!

Ответ 5

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

Лучшее решение - переопределить регистратор рельсов по умолчанию в файле (-ях) конфигурации приложения.

# in config/environments/development.rb
config.logger = Logger.new("#{Rails.env}.log", "daily")

а затем используйте script, который очищает файлы старше n дней. Если хотите, вы можете использовать logrotate для этой части. Мы используем команду rake, например,

desc "Cleanup application logs older than 30 days"
task :logs => :environment do
  require 'fileutils'
  Dir.glob("#{Rails.root}/log/*.log.*").
    select{|f| File.mtime(f) < (Time.now - (60*60*24*30)) }. # older than 30 days
    each { |f| 
      puts "Removing #{f}"
      FileUtils.rm f 
    }
end

Ответ 6

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

/etc/logrotate.d/rails

<path_to_rails_app>/log/*.log {
  daily
  size 100M
  missingok
  notifempty
  rotate 4
  compress
  delaycompress
  copytruncate
  nodateext
 }