Ruby: проблема с неинициализированной константой Log4r ::DEBUG (NameError)

#ruby #log4r

#ruby #log4r

Вопрос:

При использовании log4r в Ruby я написал файл конфигурации, аналогичный следующему:

   require 'rubygems'
  require 'log4r'
  require 'log4r/outputter/datefileoutputter' 
  SERVICE_LOG = {
    :log_name         => 'service',
    :log_file         => 'service.log',
    :log_level        => Log4r::DEBUG, 
    :message_pattern  => "[%-5l %d] %C: %M",
    :date_pattern     => "%Y-%m-%d %H:%M:%S"
  }
  

когда я запустил ее, она выдала следующее исключение:

  C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:440:in `load_missing_constant': uninitialized constant Log4r::DEBUG (NameError)
  

Почему это произошло?

Ответ №1:

Это немного странно. Вам необходимо создать logger экземпляр, прежде чем вы сможете получить доступ к константам уровня журнала. Вот как это выглядит в irb:

 >> require "log4r"
=> true
>> Log4r::DEBUG
NameError: uninitialized constant Log4r::DEBUG
    from (irb):2
>> Log4r::Logger.root
=> #<Log4r::RootLogger:0x101737948 @outputters=[], @level=0>
>> Log4r::DEBUG
=> 1
>>
  

Для поддержки пользовательских уровней уровни журнала загружаются только при загрузке экземпляра (можно спорить, правильный ли это подход).

Это код, который фактически загружает уровни (вызывается из RootLogger#instance ):

 Log4r.define_levels(*Log4rConfig::LogLevels)
  

Итак, в вашем коде вы можете называть это так:

 require 'rubygems'
require 'log4r'
require 'log4r/outputter/datefileoutputter' 
Log4r.define_levels(*Log4r::Log4rConfig::LogLevels)
SERVICE_LOG = {
  :log_name         => 'service',
  :log_file         => 'service.log',
  :log_level        => Log4r::DEBUG, 
  :message_pattern  => "[%-5l %d] %C: %M",
  :date_pattern     => "%Y-%m-%d %H:%M:%S"
}
  

Ответ №2:

Похоже, что эти константы больше не существуют. Однако я обнаружил следующее:

 >> Log4r::Log4rConfig.const_get :LogLevels 
#=> ["DEBUG", "INFO", "WARN", "ERROR", "FATAL"]
  

Может быть, взгляните на их примеры (например, require и include Log4r):

http://log4r.rubyforge.org/manual.html#outofbox

Ответ №3:

Возможно, вы могли бы попробовать что-то вроде этого

 require 'rubygems'
require 'log4r'

L4R = Log4r::Logger.new("Logger")
Log4r::FileOutputter.new('service',
                         :filename=>"service.log",
                         :level=>Log4r::DEBUG)
L4R.add('service')