Ruby Log4r имеет проблемы с печатью дважды сообщений журнала
Я использую log4r в качестве моего регистратора. У меня два вопроса к четверке.
- Я нахожу таинственное поведение, такое, что сообщения журнала печатаются дважды в STDOUT. Я не понимаю, почему это происходит и как это исправить.
- Я хотел бы предоставить цветовое кодирование для тегов уровня (FATAL как красный, ERROR как фиолетовый, WARN как оранжевый, INFO как зеленый и т. Д.). Это должно быть эффективно только для STDOUT, и никакие специальные (мета) символы не должны попадать в мой файл журнала (чтобы его было легче читать). Я попробовал несколько попыток, но не смог добиться этого. Как исправить?
Ниже приводится подробное описание моего кода, который я использую. Пожалуйста, помогите в решении этой проблемы.
Моя конфигурация YAML выглядит следующим образом: Файл: yml.cfg
# *** YAML2LOG4R ***
log4r_config:
# define all pre config global log4r settings ...
pre_config:
custom_levels:
- DEBUG2
- DEBUG
- PRINT
- INFO
- WARN
- ERROR
- FATAL
global:
level : ALL
root :
level : DEBUG2
trace : 'true'
# define all outputters (stderr, stdout and logfile with custom formatters)
outputters:
- type : StderrOutputter
name : stderr
level : ERROR
only_at :
- ERROR
- FATAL
formatter:
pattern : '%-7l: %m'
type : PatternFormatter
- type : StdoutOutputter
name : stdout
level : INFO
only_at :
- INFO
- WARN
- ERROR
- FATAL
formatter:
pattern : '%-7l: %m'
type : PatternFormatter
- type : FileOutputter
filename : debug.log
name : logfile
level : ALL
trace : 'true'
trunc : 'false'
formatter :
type : MyLogFormatter
loggers:
- name : MyAppClass
additive : 'false'
trace : 'true'
level : ALL
outputters :
- stderr
- stdout
- logfile
У меня есть класс конфигурации журнала (logConfig.rb)
require 'log4r'
require 'log4r/lib/yamlconfigurator'
class LogConfig
class Log4r::MyLogFormatter < Log4r::Formatter
def format(event)
buff = "%-7s: " % Log4r::LNAMES[event.level]
buff += "(Trace: %-30s): " % [event.tracer[0].split(File::SEPARATOR)[-1]]
if event.data.kind_of?(String) then buff += event.data
elsif event.data.kind_of?(Array) then buff += "\n\t\t%s : %s\n" % [event.data.class, event.data.inspect]
elsif event.data.kind_of?(Hash) then buff += "\n\t\t%s : %s\n" % [event.data.class, event.data.inspect] end
return buff + "\n"
end
end # class MyLogFormatter
def initialize
cfg = Log4r::YamlConfigurator
cfg.load_yaml_file('yml.cfg')
Log4r::StderrOutputter.new 'console'
Log4r::StdoutOutputter.new 'console'
end # def initialize
end # class LogConfig
В моем классе приложения (myClass.rb)
require 'logConfig'
class MyAppClass
ClassName = self
def initialize
LogConfig.new
@log = Log4r::Logger["#{ClassName}"]
end # initialize
def print_logs
@log.fatal 'this is fatal'
@log.error 'this is error'
@log.warn 'this is warning'
@log.info 'this is info'
@log.print 'this is print'
@log.debug 'this is debug'
@log.debug2 'this is debug2'
end
end
MyAppClass.new().print_logs
В файле debug.log я получаю ожидаемые сообщения правильно:
FATAL : (Trace: myClass.rb:11:in `print_logs' ): this is fatal
ERROR : (Trace: myClass.rb:12:in `print_logs' ): this is error
WARN : (Trace: myClass.rb:13:in `print_logs' ): this is warning
INFO : (Trace: myClass.rb:14:in `print_logs' ): this is info
PRINT : (Trace: myClass.rb:15:in `print_logs' ): this is print
DEBUG : (Trace: myClass.rb:16:in `print_logs' ): this is debug
DEBUG2 : (Trace: myClass.rb:17:in `print_logs' ): this is debug2
Однако, в консоли (терминале), я получаю сообщения об ОШИБКАХ и ФАТАЛЬНЫХ, напечатанные дважды.
>ruby myClass.rb
FATAL : this is fatal
FATAL : this is fatal
ERROR : this is error
ERROR : this is error
WARN : this is warning
INFO : this is info
Пожалуйста, помогите решить выше.
1 ответ
Я думаю, вы упомянули то же самое в конфигурационном файле.
outputters:
- type : StderrOutputter
name : stderr
level : ERROR
only_at :
- ERROR
- FATAL
- type : StdoutOutputter
name : stdout
level : INFO
only_at :
- INFO
- WARN
- ERROR
- FATAL
- type : FileOutputter
filename : debug.log
name : logfile
level : ALL
trace : 'true'
trunc : 'false'
Error и Fatal должны быть напечатаны как для stdout, так и для stderr.
и в консоли вы спрашиваете как stdout и stderr принты
Log4r::StderrOutputter.new 'console'
Log4r::StdoutOutputter.new 'console'
Просто удалите ошибку и фатальную ошибку в стандартном выводе конфигурационного файла, и эти два отпечатка исчезнут. Так что для фатальных ошибок или ошибок он возьмет stderr, а для информации и предупредит, что будет использовать stdout.
Что касается цветов, вы можете использовать http://rubygems.org/gems/log4r-color вместо log4r. Это расширение гема log4r. Пожалуйста, посмотрите на Class: Log4r::ColorOutputter