10

我像这样使用红宝石记录器:

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

MultiIO我从这个答案中得到的课程在哪里。大多数情况下,这很好用,但我使用'colored'ruby​​gem 在终端上提供彩色输出。不幸的是,这也最终出现在日志文件中,因为 ANSI 转义看起来像[32mPASS[0m或一些类似的不可打印字符垃圾。

在保持 tty 字符串颜色的同时清理日志文件字符串的最佳方法是什么?我不介意猴子补丁LoggerMultiIO,但我绝对不希望对 logfile 和 screen 进行两次不同的调用。

4

3 回答 3

13

这是我目前的解决方案

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))
于 2013-04-16T10:12:21.040 回答
6

着色宝石

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
于 2014-11-08T09:49:17.390 回答
6

为了去除 ANSI 颜色,我建议

string_with_ascii = "..."
string_no_ascii = string_with_ascii.gsub(/\e\[([;\d]+)?m/, '')
于 2016-03-09T14:44:46.443 回答