2013-04-16 38 views
8

我使用紅寶石日誌如在此之前:去除串色裝飾寫他們記錄到logfile

$logger = Logger.new MultiIO.new($stdout, log_file) 

MultiIO是一類我從this answer了。這很好,主要是,但我使用'colored' ruby​​gem給終端上的彩色輸出。不幸的是,當ANSI轉義看起來像[32mPASS[0m或一些類似的非可打印字符垃圾時,這也會在日誌文件中結束。

在保留tty字符串的顏色的同時清理日誌文件字符串的最佳方法是什麼?我不介意猴子補丁LoggerMultiIO,但我絕對不希望兩個不同的日誌文件和屏幕調用。

+0

我從來沒有在我的日誌文件中使用ANSI轉義字符的問題。大多數Unix工具('cat','more','less','grep','tail'等等)處理它們就好了。 – Stefan

+1

是的,我知道,不幸的是,那些需要這些的人可能最好使用notepad.exe或gedit。 – wim

回答

11

這是我目前的解決方案

class ColourBlind 
    def initialize(*targets) 
    @targets = targets 
    end 

    def write(*args) 
    @targets.each {|t| t.write(*args.map {|x| x.gsub(/\e\[(\d+)m/, '')}.compact)} 
    end 

    def close 
    @targets.each(&:close) 
    end 
end 

然後:

$logger = Logger.new MultiIO.new($stdout, ColourBlind.new(log_file)) 
+6

'/ \ e \ [(\ d +)(; \ d +)* m /'應該會更好,因爲有時候人們會在一些telnet程序中將前景和背景顏色放在一起。 – xis

6

colorize gem

class String 
    REGEXP_PATTERN = /\033\[([0-9]+);([0-9]+);([0-9]+)m(.+?)\033\[0m|([^\033]+)/m 

    def uncolorize 
    self.scan(REGEXP_PATTERN).inject("") do |str, match| 
     str << (match[3] || match[4]) 
    end 
    end 
end 
+0

Gem已更新,並且uncolorize似乎不會去除顏色,而是將轉義添加到輸出中。 –

+0

UNCOLORIZE_REGEXP =/\ e \ [[; m \ d] +/ – Vlad

+1

* string_variable.uncolorize *適用於我 –

4

爲了除掉ASCII顏色,我會建議

string_with_ascii = "..." 
string_no_ascii = string_with_ascii.gsub(/\e\[([;\d]+)?m/, '')