0

ロガーとしてlog4r-colorを使用しています。コンソール出力をファイルに出力するまで、標準出力 (コンソール) に色付きのテキストを配置することでうまく機能します。( ruby myApp | tee console.log)。2 つの質問があります。

  1. log4r を使用して色付きのメッセージを出力STDOUTすると同時に、すべてのstdoutメッセージがファイルに記録されるようにするにはどうすればよいですか。ColorOutputter にファイル名を指定できますか?
  2. メッセージ全体ではなく、レベル ラベルのみに色を付けるにはどうすればよいですか?

提案をお待ちしております。

4

1 に答える 1

0

tee の代わりに、stdout 用とファイル用の 2 つのロガーが必要です。

私は知りませんlog4r-color、私は使用しますlog4r

色付けしたい場合log4r、PatternFormatter を使用すると、私が書いたこのモンキーパッチでフォーマットされたログレベルに %L を使用できます:

require 'log4r'

original_verbosity = $VERBOSE
$VERBOSE = nil
module Log4r
  class PatternFormatter
    DirectiveTable = {
      "c" => 'event.name',
      "C" => 'event.fullname',
      "d" => 'format_date',
      "g" => 'Log4r::GDC.get()',
      "t" => '(event.tracer.nil? ? "no trace" : event.tracer[0])',
      "T" => '(event.tracer.nil? ? "no trace" : event.tracer[0].split(File::SEPARATOR)[-1])',
      "m" => 'event.data',
      "h" => '(Thread.current[:name] or Thread.current.to_s)',
      "p" => 'Process.pid.to_s',
      "M" => 'format_object(event.data)',
      "l" => 'LNAMES[event.level]',
      "L" => %q|case LNAMES[event.level]
                when "ERROR"
                  "\e[31m#{LNAMES[event.level][0..3]}\e[0m"
                when "WARNING"
                  "\e[33m#{LNAMES[event.level][0..3]}\e[0m"
                when "INFO"
                  "\e[32m#{LNAMES[event.level][0..3]}\e[0m"
                else
                  LNAMES[event.level][0..3]
                end|,
      "x" => 'Log4r::NDC.get()',
      "X" => 'Log4r::MDC.get("DTR_REPLACE")',
      "%" => '"%"'
    }
    DirectiveRegexp = /([^%]*)((%-?\d*(\.\d+)?)([cCdgtTmhpMlLxX%]))?(\{.+?\})?(.*)/
  end
end
$VERBOSE = original_verbosity

[0..3]これにより、レベルが 4 文字幅にカットされます。気に入らない場合は、-sを削除できます

于 2013-12-05T13:03:01.367 に答える