我使用log4r-color作为记录器。通过将彩色文本放在标准输出(控制台)上效果很好,直到我将控制台输出发送到文件。( ruby myApp | tee console.log
)。我有两个问题:
- 如何使用 log4r 打印彩色消息,
STDOUT
同时所有stdout
消息都记录到文件中。我可以给 ColorOutputter 提供文件名吗? - 如何仅着色级别标签,而不是整个消息?
感谢任何建议。
我使用log4r-color作为记录器。通过将彩色文本放在标准输出(控制台)上效果很好,直到我将控制台输出发送到文件。( ruby myApp | tee console.log
)。我有两个问题:
STDOUT
同时所有stdout
消息都记录到文件中。我可以给 ColorOutputter 提供文件名吗?感谢任何建议。
您需要两个记录器而不是 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