Как использовать Ruby Log4r Colorize для печати цветного текста на стандартный вывод и неокрашенного текста в файл
Я использую log4r-цвет в качестве регистратора. Он отлично работает, помещая цветной текст в стандартный вывод (консоль), пока я не отправлю вывод консоли в файл. (ruby myApp | tee console.log
). У меня есть два вопроса:
- Как использовать log4r для печати цветного сообщения на
STDOUT
и в то же время всеstdout
сообщения попадают в файл. Могу ли я дать имя файла ColorOutputter? - Как раскрасить только метку уровня, а не все сообщение?
Ценю любые предложения.
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, если вам это не нравится