2013-04-16 5 views
8

używać rejestratora ruby ​​tak:Usuwanie kolorowej dekoracji z ciągów znaków przed zapisaniem ich do logfile

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

Jeżeli MultiIO to klasa dostałem od this answer. Działa to świetnie, głównie, ale używam rubygem 'colored', aby nadać kolorowy wydruk na terminalu. Niestety kończy się to również w pliku logu, ponieważ ANSI ucieka wyglądając jak [32mPASS[0m lub niektóre podobne niedrukowalne znaki śmieci.

Jakie jest najlepsze podejście do odkażania ciągów plików dziennika przy zachowaniu kolorów dla ciągów tty? Nie mam nic przeciwko poprawianiu małpkom Logger lub MultiIO, ale absolutnie nie chcę dwóch różnych wywołań dla pliku logu i ekranu.

+0

Nigdy nie miałem żadnych problemów ze znakami escape ANSI w moich plikach dziennika. Większość narzędzi uniksowych ('cat',' more', 'less',' grep', 'tail' itd.) Radzi sobie z nimi dobrze. – Stefan

+1

Tak, wiem, niestety ludzie, którzy będą ich potrzebować, prawdopodobnie będą używać programu notepad.exe lub w najlepszym razie gedit. – wim

Odpowiedz

11

To jest moje obecne rozwiązanie

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 

A potem:

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

'/ \ e \ [(\ d +) (; \ d +) * m /' powinno być lepsze, ponieważ czasami ludzie umieszczają pierwszy plan i kolor tła razem w niektórych programach telnet. – xis

6

Z 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

Klejnot został zaktualizowany, a jego pomniejszanie nie wydaje się usuwać kolorów, ale raczej dodaje wyjście do wyjścia. –

+0

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

+1

* string_variable.uncolorize * działa dla mnie –

4

Do usuwania barw ASCII, polecam

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