colbygk/log4r

Adding child logger before initial parent results in unexpected level

electrofelix opened this issue · 1 comments

Defining a child logger before the initial parent will result in the child logger receiving a level of 0 instead of the default from the parent.

This means that developers need to be very careful about the load order of modules and classes or alternatively should provide a mechanism to easily reset child logger levels on defining of a parent logger.

At the very least, I'd suggest documenting the current behaviour more clearly to warn developers that order is important.

See vagrant-libvirt/vagrant-libvirt#430

I think this is a good testcase:

require 'log4r'

class Foo
  module Logging
    def Logging.included( klass )
      Log4r::Logger.new klass.name
    end

    def logger
      @logger ||= Log4r::Logger[ self.class.name.to_s ]

      #  Here @logger.level === 0...

      @logger
    end
  end

  # Dynamically define logging
  class Bar
    include Foo::Logging
    def initialize
      logger.info "Hello from #{self.class.name}"
    end
  end

  def initialize
    trouble = Log4r::Logger.new 'log4r'
    trouble.add Log4r::Outputter.stdout

    l = Log4r::Logger.new 'Foo'
    l.add Log4r::Outputter.stdout
    l.level = Log4r::INFO
    l.info "Hello from #{self.class.name}"
  end

end

f = Foo.new
b = Foo::Bar.new