Как использовать Ruby Log4r Colorize для печати цветного текста на стандартный вывод и неокрашенного текста в файл

Я использую log4r-цвет в качестве регистратора. Он отлично работает, помещая цветной текст в стандартный вывод (консоль), пока я не отправлю вывод консоли в файл. (ruby myApp | tee console.log). У меня есть два вопроса:

  1. Как использовать log4r для печати цветного сообщения на STDOUT и в то же время все stdout сообщения попадают в файл. Могу ли я дать имя файла ColorOutputter?
  2. Как раскрасить только метку уровня, а не все сообщение?

Ценю любые предложения.

1 ответ

Вместо тройника вам понадобятся два регистратора, один для стандартного вывода, другой для файла.

я не знаю 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, если вам это не нравится

Другие вопросы по тегам