2012-04-02 50 views
1

是否可以動態更改Ruby的LogDeviceLogger動態更改Ruby Logger的LogDevice

如果是這樣,它將允許對我現有的代碼庫進行一些不顯眼的更改。

目前紅寶石Logger使用StringIOLogDevice

@logDevice = StringIO.new("", "r+") 
@log = Logger.new(@logDevice) // a reference to this is used by many objects 
// both are instance vars 

... 

@log.info('some log') // Logging activity 

... 

// Before program ends, transmit logs to a server 

可以LogDevice被動態地改變,繼續記錄到文件? (動態變化,因爲最初的文件名是未知的。)

或者如果日誌設備不能更改可以StringIO對象開始寫入文件?

我可以寫入一個臨時日誌文件,但希望檢查是否可以完成上述操作,而不是執行上述操作,因爲這會對現有代碼庫造成不太顯着的改變。

回答

1

你給記錄程序的對象只是有落實「寫」和「關閉」的方法,讓您可以輕鬆編寫自己的「IO」:

class MyIO 
    def initialize 
    @file = nil 
    @history = StringIO.new "", "w" 
    end 

    def file=(filename) 
    @file = File.open(filename, 'a+') 
    @file.write @history.string if @history 
    @history = nil 
    end 

    def write(data) 
    @history.write(data) if @history 
    @file.write(data) if @file 
    end 

    def close 
    @file.close if @file 
    end 

創建記錄器的一個實例,並保持對實例的引用。然後,只要知道文件名,只需使用'file ='方法進行設置即可。

+0

這正是我需要的 - 謝謝! – 2012-04-03 02:12:00