Ruby Log4r имеет проблемы с печатью дважды сообщений журнала

Я использую log4r в качестве моего регистратора. У меня два вопроса к четверке.

  1. Я нахожу таинственное поведение, такое, что сообщения журнала печатаются дважды в STDOUT. Я не понимаю, почему это происходит и как это исправить.
  2. Я хотел бы предоставить цветовое кодирование для тегов уровня (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

Другие вопросы по тегам