我使用log4r作为我的记录器。我对the fourum有两个问题。
以下是我使用的代码的详细信息。请帮助解决这个问题。
我的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
但是,在控制台(终端)中,我得到两次打印的ERROR和FATAL消息。
>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
请帮助解决上述问题。
答案 0 :(得分: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'
应为stdout和stderr输出器打印Error和Fatal。
并且在控制台中你要求stdout和stderr打印
Log4r::StderrOutputter.new 'console'
Log4r::StdoutOutputter.new 'console'
只需在配置文件的stdout中删除错误和致命,然后两个打印将消失。因此,对于致命或错误,它将需要stderr和信息并警告它将使用stdout。
就颜色而言,您可以使用http://rubygems.org/gems/log4r-color而不仅仅是log4r。这是log4r gem的扩展。请查看Class: Log4r::ColorOutputter