2011-11-23 217 views
2

我有這樣的:組紅寶石logger.progname

class Stress 
    def initialize(user, pass) 
    @user = user 
    @pass = pass 
    @agent = Mechanize.new do |a| 
     a.user_agent_alias = 'Windows Mozilla' 
     a.history.max_size = 0 
     a.log = my_log 
     a.log.progname = @user 
    end 
    end 
    def browse 
    @agent.log.progname = @user 
    # open/close page 
    end 
end 

my_log = Logger.new('dump.log') 
my_log.level = Logger::DEBUG 
atom = Mutex.new 

for i in (Attempts_start..Attempts_end) 
    threads << Thread.new(Creden_base + i.to_s) do |user| 
    stress = Stress.new(user, user) 
    for j in (0..Attempts_req) do 
     atom.synchronize {stress.browse} # has to be atomic 
    end 
    end 
end 

上面的代碼通過設置將progname正確地識別由用戶在不同的線程,但問題是我必須使用互斥類來同步它,因此失去了並行計算,因爲如果我想在日誌中獲得正確的程序名,我必須等待請求被髮送和接收。

有沒有辦法做到這一點,而不使用Mutex類。在實時並行運行線程的同時,在每個線程的基礎上設置程序名。

回答

13

我終於找到了我的答案。您定義一個線程局部變量,並且您修改日誌格式化程序以在記錄時包含它。這裏是修改格式化程序的代碼。

Log.formatter = proc do |severity, datetime, progname, msg| 
    "#{severity} [#{Time.now.strftime('%H:%M:%S')}] #{Thread.current['id']} --> #{msg}\n" 
    end 

而且在每個線程將添加像這樣: Thread.current['id'] = 'whatever'