首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby:未初始化的常量Log4r::DEBUG (NameError)问题

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

Stack Overflow用户
提问于 2011-04-27 13:35:12
回答 3查看 2.7K关注 0票数 3

在Ruby语言中使用log4r时,我编写了一个类似以下内容的配置文件:

代码语言:javascript
复制
  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"
  }

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

代码语言:javascript
复制
 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)

它为什么要这么做?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-27 14:35:02

这有点奇怪。您需要先创建一个logger实例,然后才能访问日志级别常量。下面是它在irb上的样子:

代码语言:javascript
复制
>> 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调用):

代码语言:javascript
复制
Log4r.define_levels(*Log4rConfig::LogLevels)

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

代码语言:javascript
复制
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"
}
票数 8
EN

Stack Overflow用户

发布于 2011-04-27 14:28:22

这些常量似乎已经不复存在了。我的发现是这样的:

代码语言:javascript
复制
>> Log4r::Log4rConfig.const_get :LogLevels 
#=> ["DEBUG", "INFO", "WARN", "ERROR", "FATAL"]

也许可以看看他们的例子(例如requireinclude Log4r):

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

票数 2
EN

Stack Overflow用户

发布于 2011-04-27 14:46:02

也许你可以试试这样的东西

代码语言:javascript
复制
require 'rubygems'
require 'log4r'

L4R = Log4r::Logger.new("Logger")
Log4r::FileOutputter.new('service',
                         :filename=>"service.log",
                         :level=>Log4r::DEBUG)
L4R.add('service')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5799823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档