2012-11-08 31 views
4

爲了幫助跟蹤出於調試目的的用戶操作,我們正在考慮將會話的登錄用戶標識添加到每條日誌消息(適用時)。我們的棧由Rails和Authlogic組成。我嘗試了幾條不同的路線,但迄今爲止都沒有成功。將用戶標識添加到Rails中的所有日誌消息

由於Authlogic不會以會話數據中的純文本格式存儲用戶ID,我們必須等待它被初始化。只有在初始化ApplicationController並將其設置爲活動的Authlogic控制器後,纔會發生這種情況。因此,我們不能依賴config/application.rb中的代碼。在我看來,唯一的解決辦法是在稍後換出記錄器。

我已經嘗試通過繼承記錄器和覆蓋add()方法創建一個新的記錄器類:

class UserLogger < Logger 
    def add(severity, message = nil, progname = nil, &block) 
    begin 
     session = UserSession.find 
    rescue 
     return super(severity, message, progname, &block) 
    end 

    user = session.user if session 

    if block_given? || !user 
     return super(severity, message, progname, &block) 
    end 

    unless message.nil? 
     message = "[#{user.id}] " + message 
    end 

    super severity, message, progname, &block 
    end 
end 

這似乎並不會對日誌前哨不得以任何影響。我也嘗試過使用TaggedLogging,但是這似乎不是一個好的解決方案,因爲你必須在塊中拋出任何標記代碼。

我也嘗試在應用程序配置中定義config.log_tags,通過給它一個Proc,但Authlogic拋出了相同的Authlogic::Session::Activation::NotActivatedError異常。試圖捕捉這個異常將Ruby變成了一個非常奇怪的狀態,似乎是某個地方的無限循環,並將我的CPU以100%的比率掛起來。

有沒有簡單的解決方案,或者我完全失蹤?

回答

0

我的項目也使用自定義記錄器,我們將它連接到environments/production.rb。你在production.rb中設置Rails記錄器嗎?

config.logger = ActiveSupport::TaggedLogging.new(UserLogger.new) 
1

不可能從request對象訪問session對象。但您可以訪問cookies

所以,您的用戶登錄後添加以下代碼:

cookies.signed[:user_id] = @user.id 

並添加一個初始化,如:

MyApp::Application.config.log_tags = [ 
    -> request { "user-#{request.cookie_jar.signed[:user_id]}" } 
] 

現在所有的日誌都會有[user-980191314][user-]前綴。

相關問題