как использовать раскраску Ruby log4r для печати цветного текста на стандартном выходе и нецветного текста в файл

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

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

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


person user2562153    schedule 19.09.2013    source источник


Ответы (1)


Вместо tee вам нужны два регистратора, один для stdout, один для файла.

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

person jsaak    schedule 05.12.2013