Ruby:未初始化的常量Log4r :: DEBUG(NameError)问题

ywe*_*nbo 3 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"
  }
Run Code Online (Sandbox Code Playgroud)

当我运行它时,它抛出了以下异常:

 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)
Run Code Online (Sandbox Code Playgroud)

为什么这样做?

Swa*_*and 8

一个有点怪异.您需要先创建一个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
>>
Run Code Online (Sandbox Code Playgroud)

为了支持自定义级别,仅在加载实例时加载日志级别(可论证这是否是正确的方法).

这是实际加载级别的代码(从中调用RootLogger#instance):

Log4r.define_levels(*Log4rConfig::LogLevels)
Run Code Online (Sandbox Code Playgroud)

所以在你的代码中你可以调用它:

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"
}
Run Code Online (Sandbox Code Playgroud)