2011-04-27 78 views
3

虽然在Ruby中使用log4r,我写了类似的配置文件中的以下内容:红宝石:未初始化不断log4r的:: DEBUG(NameError)问题

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) 

它为什么这样做?

回答

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

为了支持custom levels日志级别仅当实例被加载(这值得商榷是否是正确的做法)被加载。

这是实际加载水平的代码(从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" 
} 
+1

非常酷,非常感谢你! – ywenbo 2011-04-27 07:15:12

2

这些常数似乎不再存在。我发现,这虽然:

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

也许看看他们的例子(如requireinclude log4r的):

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

1

或许你可以尝试像这

require 'rubygems' 
require 'log4r' 

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