2013-04-16 1 views
8

Я использую рубин логгер, как это:Удаление цвета украшений из строк перед записью их LOGFILE

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

Если MultiIO является класс, я получил от this answer. Это работает отлично, в основном, но я использую 'colored' rubygem, чтобы дать цветной вывод на терминале. К сожалению, это также входит в лог-файл, так как ANSI ускользает от [32mPASS[0m или некоторых подобных непечатаемых символов.

Каков наилучший подход к дезинфекции строк журнала, сохраняя цвета для строк tty? Я не против обезьян-исправления Logger или MultiIO, но я абсолютно не хочу двух разных вызовов для файла журнала и экрана.

+0

У меня никогда не было проблем с escape-символами 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/, '') 

 Смежные вопросы

  • Нет связанных вопросов^_^