10

私はこのようにルビーロガーを使用します:

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

この答えMultiIOから得たクラスはどこですか。これはほとんどの場合うまく機能しますが、端末で色付きの出力を行うために ruby​​gem を使用しています。残念ながら、これはログファイルにも記録されます。ANSI エスケープは、印刷できない文字のように見えたり、似たようなゴミのように見えたりするからです。 'colored'[32mPASS[0m

tty 文字列の色を維持しながらログファイル文字列をサニタイズする最良の方法は何ですか? Loggerモンキー パッチやは気にしませんMultiIOが、logfile と screen の 2 つの異なる呼び出しは絶対に必要ありません。

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

From the 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
于 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 に答える