2011-04-05 17 views
9

Rails uygulamasının her tek boynuzlu atı çalışanını farklı bir günlük dosyasına yazmasını nasıl sağlayabilirim?Rails uygulamasının tek boynuzlu atı çalışanı nasıl farklı bir dosyaya kaydedilir?

Neden: karışık günlük dosyaları sorunu ... Varsayılan yapılandırmasında, Rails günlük iletilerini tek bir günlük dosyasına yazacaktır: log/<environment>.log.

Tek boynuzlu atlar, aynı kayıt dosyasına aynı anda yazacak, mesajlar karışabilir. Request-log-analyzer bir log dosyasını ayrıştırdığında bu bir sorundur. Bir örnek: Bu örnekte

Processing Controller1#action1 ... 
Processing Controller2#action2 ... 
Completed in 100ms... 
Completed in 567ms... 

, hangi işlemin 100ms tamamlanan ve 567 ms hangi işlemin edildi? Asla emin olamayız.

cevap

3

unicorn.rb içinde after_fork için bu kodu ekleyin:

#one log per unicorn worker 
if log = Rails.logger.instance_values['log'] 
    ext = File.extname log.path 
    new_path =log.path.gsub %r{(.*)(#{Regexp.escape ext})}, "\\1.#{worker.nr}\\2" 
    Rails.logger.instance_eval do 
    @log.close 
    @log= open_log new_path, 'a+' 
    end 
end 
+0

Should Rails 2.3 uygulamasında bu uygulama çalışır mı? Bu konudaki hiç kimse, kodlarının hangi sürümlerde çalışacağını gerçekten belirtti ve ben bu eski şeyi oldukça eski bir uygulamada yapmaya çalışıyorum, ancak bunun nasıl yapılacağından emin değilim. –

2

slact cevabı @ Ruby on çalışmıyor 3. This works:

after_fork do |server, worker| 

    # Override the default logger to use a separate log for each Unicorn worker. 
    # https://github.com/rails/rails/blob/3-2-stable/railties/lib/rails/application/bootstrap.rb#L23-L49 
    Rails.logger = ActiveRecord::Base.logger = ActionController::Base.logger = begin 
    path = Rails.configuration.paths["log"].first 
    f = File.open(path.sub(".log", "-#{worker.nr}.log"), "a") 
    f.binmode 
    f.sync = true 
    logger = ActiveSupport::TaggedLogging.new(ActiveSupport::BufferedLogger.new(f)) 
    logger.level = ActiveSupport::BufferedLogger.const_get(Rails.configuration.log_level.to_s.upcase) 
    logger 
    end 
end