Ruby Log4r在打印两次日志消息时出现问题

时间:2013-09-19 13:04:39

标签: ruby log4r

我使用log4r作为我的记录器。我对the fourum有两个问题。

  1. 我发现了一个神秘的行为,因此日志消息在STDOUT中打印两次。我不明白它为什么会发生以及如何解决。
  2. 我想为关卡标签提供颜色编码(FATAL为Red,ERROR为Purple,WARN为Orange,INFO为Green,等等)。这只需要对STDOUT有效,并且我的日志文件中不应该有特殊的(元)字符(以便于阅读)。我尝试了几次尝试,但无法做到这一点。怎么解决?
  3. 以下是我使用的代码的详细信息。请帮助解决这个问题。

    我的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
    

    请帮助解决上述问题。

1 个答案:

答案 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