2013-04-30 17 views
4

Ruby新手我現在有一個簡單的驅動程序腳本,它在其他ruby文件中運行多個測試腳本。我有一個名爲RunScript()的方法來運行測試腳本。記錄器作爲驅動程序腳本中的全局變量創建,以便其他文件中的測試腳本可以使用它。記錄器記錄到目錄中的日誌文件。捕獲方法內的記錄器輸出

我想要做的就是捕獲在RunScript()方法僅運行時發生的日誌輸出,並將其存儲爲字符串。所以基本上我想爲每個測試腳本提供一串日誌輸出,並保留存儲所有輸出的日誌文件。

回答

5

我已經做了這幾種不同的方式,我發現最方便的是要建立一個代表團對象,將消息路由到兩個或更多的記錄器:

require 'stringio' 
require 'logger' 

class LoggerTee 

    def initialize *loggers 
    @loggers = loggers 
    end 

    def method_missing meth, *args, &block 
    @loggers.each { |logger| logger.send(meth, *args, &block) } 
    end 

end 

capture_stringio = StringIO.new 
console_log = Logger.new(STDOUT) 
string_log = Logger.new(capture_stringio) 
log = LoggerTee.new(console_log, string_log) 

log.debug 'Hello world' 
puts capture_stringio.string 

輸出:

D, [2013-04-30T18:59:18.026285 #14533] DEBUG -- : Hello world 
D, [2013-04-30T18:59:18.026344 #14533] DEBUG -- : Hello world 

在這個例子中,LoggerTee類用兩個獨立的記錄器實例化,一個進入控制檯,另一個進入一個StringIO實例。生成的LoggerTee實例是任何標準記錄器對象的替代品。

+0

這個工作完美一些修改後的感謝! – sng 2013-05-01 16:31:31

+0

只爲其他可能有相同問題的人提供,我在運行方法的開始處添加了@@ capture_stringio.truncate(@@ capturestringio.rewind),以便清除下一個腳本的日誌內容。 – sng 2013-05-03 15:39:15

1

確實沒有辦法在沒有導入額外的東西的情況下獲取記錄器的內容。這是一個不同的解決方案。 由於記錄儀只有幾個測井方法,你可以簡單地讓自己和日誌,並在功能

#the_logger - regular logger 
    #the_arr - a global array to keep your logs in 
    #the_string - log string 

    def log_info(the_logger, the_arr, the_string) 

     the_logger.info(the_string); 
     the_arr.push(the_string); 
    end 
    .....................and use global the_arr to get your output 

做此「調試」,「信息」,「致命的」收集日誌,這是用一個簡單的方法您的日誌輸出爲你運行程序