2011-05-10 72 views
4

Rails記錄器具有auto_flushing方法。它會延遲寫入日誌,直到條目數與所設置的條目數相同。這是自Rails 2以來一直存在的,它旨在通過停止在負載下持續寫入磁盤來加快速度。如何在進程死亡時寫入/清除Rails日誌

大多數情況下都很好,但是我們有短時間運行的作業,永遠不會停留足夠長的時間以便通過刷新 - 任何錯誤消失。

有什麼辦法可以保證日誌在進程死亡時被刷新?

編輯

最後,我這樣做(但它是非常詳細)

af = Rails.logger.auto_flushing 
Rails.logger.auto_flushing = true 
Rails.logger.error "my message" 
Rails.logger.auto_flushing = af 

這迫使該消息出來,但把汽車沖洗回之後

對於真正完整的解決方案把它放在初始化程序中:

class << Rails.logger 
    def flush_error(message) 
    Rails.logger.error message 
    Rails.logger.flush 
    end 
end 

然後只是使用方法,當...

+1

我會在每次記錄器調用時都會發生刷新,但會導致性能下降(但如果您沒有記錄整個日誌,那麼可能會出現問題) – madlep 2011-05-25 11:01:15

+1

這個* point *方法是隻在你想要的時候調用flush,就像你可能正在追查一個在進程終止之前沒有到達日誌中的生產問題 - 比如在一個resque任務中 – Ghoti 2011-05-25 19:47:19

+0

OOC - 你實際上是否遇到過這種問題?當它發生時 - 流程是否拋出異常或者完全失敗? – 2011-05-30 10:18:53

回答

3

你不能設置爲「1」,它會沖洗後,每封郵件?

config.logger.auto_flushing = 1 

[編輯:如madlep以上評論指出 - 這將是一個總的資源佔用,並有可能沒有記錄的,一般最好的方式。但是如果你是找蟲子的話 - 這是一種找到它的方法。這和您的日誌切換到「調試級別」]

您也可以將它關閉:

config.logger.auto_flushing = false 

但是,這只是意味着你必須手動刷新......

或者,您可以

Rails.logger.flush 
+0

這沒有幫助 - 因爲我試圖保留默認行爲,但確保它在流程終止時刷新。 – Ghoti 2011-05-12 08:21:36

+0

如果進程終止 - 那麼沒有什麼可以刷新日誌。因爲它已經死了......這就是要點。 所以唯一的選擇是定期刷新,以便所有的事情都可以進行到日誌。 – 2011-05-15 15:10:19

+0

你是對的 - 我想在Java中使用永遠不可靠的finalize方法,但獨角獸/雜種等只是死亡 – Ghoti 2011-05-21 16:58:31

2

嘗試像

:在每個腳本的與最終明確刷新記錄
Signal.trap("EXIT") { Rails.logger.flush } 

當您初始化日誌記錄以向進程註冊信號處理程序時。當它死,它會執行無論是在塊終止

更多信息,請參見the docs

(注 - 軌道記錄器沒有經過測試的代碼,但工程在短短做一些一般情況下。當處理管芯

+0

這絕對是很好的代碼 - 但只會陷入自願退出...不是當程序剛剛死亡(例如由於SEGV或類似的)。 只是在說'。 :) – 2011-05-30 10:17:26

1

鐵軌3.1的,這​​是不再需要:在Railties應用/ bootstrap.rb代碼現在在at_exit包括刷新日誌

享受。

4

如果由於某種原因,軌道不運行at_exit鉤(飛猴理智潛逃),你真的真的希望這些日誌條目,做像有些人說和重要的日誌記錄語句後運行該:

Rails.logger.flush 

logger.flush 

瞧。