2011-04-27 79 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')