在将字符串写入日志文件之前从字符串中删除颜色装饰

wim*_*wim 9 ruby logging colors ansi-escape

我像这样使用ruby记录器:

$logger = Logger.new MultiIO.new($stdout, log_file)
Run Code Online (Sandbox Code Playgroud)

MultiIO是我从这个答案得到的一个班级.这主要是很好用,但我使用'colored'rubygem在终端上给出彩色输出.不幸的是,这也会在日志文件中结束,因为ANSI转义看起来像[32mPASS[0m或类似的非可打印字符垃圾.

清除日志文件字符串同时保持tty字符串颜色的最佳方法是什么?我不介意猴子修补LoggerMultiIO,但我绝对不希望两个不同的日志文件和屏幕调用.

wim*_*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
Run Code Online (Sandbox Code Playgroud)

然后:

$logger = Logger.new MultiIO.new($stdout, ColourBlind.new(log_file))
Run Code Online (Sandbox Code Playgroud)

  • `/\e\[(\ d +)(;\d +)*m /`应该更好,因为有时候人们会在一些telnet程序中将前景和背景颜色放在一起. (7认同)

Lev*_*tix 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
Run Code Online (Sandbox Code Playgroud)


Har*_*ina 5

为了去除ASCII颜色,我建议

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