首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby Log4r存在打印两次日志消息的问题。

Ruby Log4r存在打印两次日志消息的问题。
EN

Stack Overflow用户
提问于 2013-09-19 13:04:38
回答 1查看 580关注 0票数 1

我使用log4r作为我的记录器。我有两个问题要问四。

  1. 我发现一种神秘的行为,在STDOUT中,日志消息被打印了两次。我不明白为什么会发生这种情况,也不明白如何解决。
  2. 我想为级别标签提供颜色编码(红色是致命的,错误是紫色,警告是橙色,信息是绿色等等)。这只需要对STDOUT有效,没有特殊(元)字符应该出现在我的日志文件中(以便于阅读)。我试了几次,但都没能做到。怎么修?

下面是我使用的代码的详细信息。请帮助解决这个问题。

我的YAML配置如下: File:yml.cfg

代码语言:javascript
复制
    # *** 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)

代码语言:javascript
复制
 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)中

代码语言:javascript
复制
  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文件中,我正确地获得了预期的消息:

代码语言:javascript
复制
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

但是,在控制台(终端)中,我会得到两次打印的错误和致命消息。

代码语言:javascript
复制
>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

请帮助解决上述问题。

EN

回答 1

Stack Overflow用户

发布于 2013-09-19 13:36:43

我想您在配置文件中提到了相同的内容。

代码语言:javascript
复制
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输出程序,都应该打印错误和致命信息。

在控制台中,您要求的是stdout和stderr打印。

代码语言:javascript
复制
      Log4r::StderrOutputter.new 'console'
      Log4r::StdoutOutputter.new 'console'

只要删除配置文件的stdout中的错误和致命错误,这两个打印就会消失。因此,对于致命或错误,它将采取stderr和信息和警告,它将使用stdout。

就颜色而言,你可以使用http://rubygems.org/gems/log4r-color而不仅仅是log4r。这是log4r gem的扩展。请看一下Class: Log4r::ColorOutputter

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18895425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档