2011-04-05 41 views
9

如何讓我的Rails應用程序的每個獨角獸工作人員寫入不同的日誌文件?如何讓我的Rails應用程序的每個獨角獸工作人員登錄到不同的文件?

原因:混合日誌文件的問題... 在其默認配置中,Rails將其日誌消息寫入單個日誌文件:log/<environment>.log

獨角獸工作者會一次寫入同一個日誌文件,這些消息可能會混淆起來。請求日誌分析器解析日誌文件時,這是一個問題。舉個例子:

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

在這個例子中,什麼樣的行動在100毫秒完成,並在567毫秒什麼行動?我們永遠無法確定。

回答

3

添加該代碼unicorn.rb到after_fork:

#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

在Rails 2.3的應用程序這一實施工作?這個線程中沒有人真的指定了他們的代碼可以工作的版本,我試圖在一個相當古老的應用中做這件事,但不知道如何去做。 – 2017-01-13 01:56:03

2

@ slact的回答on Rails的不起作用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 
應該
相關問題