Каков наилучший способ поворота журналов для приложения 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
}