简体   繁体   中英

NameError: uninitialized constant Logger - Should I be doing this differently?

Fairly new to ruby, playing with Mini Test and log4r, trying to write a wrapper class.

Getting the following error:

Run options: --seed 18181

# Running tests:

E

Finished tests in 0.015625s, 63.9996 tests/s, 0.0000 assertions/s.

  1) Error:
test_debug_messages(TestLogger):
NameError: uninitialized constant Logger
    /home/jamlopez/scripts/Yatra.Next/rpm_framework/lib/rpm/core/logger.rb:7:in `initialize'
    logger.rb:6:in `new'
    logger.rb:6:in `setup'

1 tests, 0 assertions, 0 failures, 1 errors, 0 skips

Here's the class:

require 'log4r'

# RPM Framework Logger
# Based on and utilizing log4r >= 1.1.10
class RPMLogger
    def initialize
        @log = ::Logger.new 'log'
        @log.outputters = Outputter.stdout
        @logfile_location = brpm_home
        @timenow = eval( Time.now.utc.iso8601 )
    end
    def debug( msg )
        @log.debug ( '[DEBUG] ' + @timenow + " #{msg}" )
    end
    def info( msg )
        @log.info ( '[INFO] ' + @timenow + " #{msg}" )
    end
    def warn( msg )
        @log.warn ( '[WARNING] ' + @timenow + " #{msg}" )
    end
    def error( msg )
        @log.error ( '[ERROR] ' + @timenow + " #{msg}" )
    end
    def fatal( msg )
        @log.fatal ( '[FATAL] ' + @timenow + " #{msg}" )
    end
end

And here's the test:

require 'minitest/autorun'
require_relative "./../../../lib/rpm/core/logger"

class TestLogger < MiniTest::Unit::TestCase
  def setup
    @logger = RPMLogger.new
    @test_msg = "This is a test log message!"
  end

  def test_debug_messages
    log = @logger.debug( @test_msg )
    assert_match "/^[DEBUG] /", log, msg=nil
  end

end

I'll be the first to concede there are probably several errors in both files (as I'm still learning) but I'll try to take it one step at a time.

There are probably several ways to do this, I'm just not sure if this is one of them.

Using @log = ::Logger.new seems reasonable on the surface, but perhaps I should be doing an include log4r to extend the module instead? (per Ruby: module, require and include )

I've searched for related SO articles, and on the web regarding arguments to 'initialize'. Either they are not directly related, or I misunderstand them. Any assistance appreciated.

From the code sample in the manual :

 require 'log4r' include Log4r # create a logger named 'mylog' that logs to stdout mylog = Logger.new 'mylog' mylog.outputters = Outputter.stdout 

What you seem to be missing, in order to be able to use Logger , is to add below your require an include clause:

require 'log4r'
include Log4r

Alternatively you can call Log4r::Logger explicitly.

This is needed since class Logger is declared within module Log4r :

 module Log4r # See log4r/logger.rb class Logger ... 

Calling include Log4r makes all constants declared in Log4r be available in your code, Logger being one of them.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM