【问题标题】:Ruby: Uninitialized constant Log4r::DEBUG (NameError) problemRuby:未初始化的常量 Log4r::DEBUG (NameError) 问题
【发布时间】:2011-04-27 05:35:12
【问题描述】:

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

  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)

为什么要这么做?

【问题讨论】:

    标签: ruby log4r


    【解决方案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
    >>
    

    为了支持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"
    }
    

    【讨论】:

      【解决方案2】:

      这些常量似乎不再存在。我发现的是这样的:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-05-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-13
          相关资源
          最近更新 更多