0

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

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

感谢任何建议。

4

1 回答 1

0

您需要两个记录器而不是 tee,一个用于标准输出,一个用于文件。

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

于 2013-12-05T13:03:01.367 回答