如何使用Ruby log4r colorize将stdout和非彩色文本的彩色文本打印到文件中

时间:2013-09-19 18:26:30

标签: ruby logging log4r

我使用log4r-color作为记录器。通过在stdout(控制台)上放置彩色文本,它可以很好地工作,直到我将控制台输出发送到文件。 (ruby myApp | tee console.log)。我有两个问题:

  1. 如何使用log4r在STDOUT打印彩色消息,同时所有stdout消息都会记录到文件中。我可以给ColorOutputter提供文件名吗?
  2. 如何仅对级别标签着色,而不是整个消息?
  3. 感谢任何建议。

1 个答案:

答案 0 :(得分:0)

而不是发球台,你需要两个记录器,一个用于标准输出,一个用于文件。

我不知道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

这也将级别缩小为4个字符,如果你不喜欢,可以删除[0..3] - s