Forum: Ruby ruby's Logger conflict with Log4r's Logger

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
capitain (Guest)
on 2005-12-11 10:53
(Received via mailing list)
Both of them has a class named "Logger"

I used to include Log4r in my code so I can use Logger as a shortcut of
Log4r::Logger .
It works ok when useing "Logger[name]" to get logger

Today I add the library "bluecloth" to my application. I found that
when requiring bluecloth,BlueCloth required 'logger' in its
"bluecloth.rb", So Ruby's internal Logger class overwrite the
Log4r::Logger in context, and doing 'include Log4r' again didn't make
the Logger turn back. The Logger is always ruby's internal Logger and
mine "Logger[name]' can't execute now (maybe the priority of "include
Log4r" is less than "require 'logger' ?")

Is there any solution except replacing every "Logger" to
"Log4r::Logger" in my code?
langstefan (Guest)
on 2005-12-11 13:24
(Received via mailing list)
On Sunday 11 December 2005 09:52, cap wrote:
> Both of them has a class named "Logger"
>
> I used to include Log4r in my code so I can use Logger as a
> shortcut of Log4r::Logger .
> It works ok when useing "Logger[name]" to get logger

I know it doesn't help now: As a general suggestion: Never
include a module at the top level only to get shorter names!

Ruby's include is *not* like "import" in Java or "using" in
C# or "from xy import *" in Python.

> Today I add the library "bluecloth" to my application. I found that
> when requiring bluecloth,BlueCloth required 'logger' in its
> "bluecloth.rb", So Ruby's internal Logger class overwrite the
> Log4r::Logger in context, and doing 'include Log4r' again didn't
> make the Logger turn back. The Logger is always ruby's internal
> Logger and mine "Logger[name]' can't execute now (maybe the
> priority of "include Log4r" is less than "require 'logger' ?")
>
> Is there any solution except replacing every "Logger" to
> "Log4r::Logger" in my code?

If it is possible to wrap your code in a module:

    module MyNamespace
        include Log4r

         # Now Logger will always reference Log4r::Logger
    end

Or even better:

    module MyNamespace
        # don't include other Log4r methods and constants,
        # just create a shortcut for Log4r::Logger
        Logger = Log4r::Logger

        # define classes, modules, ...
    end

Regards,
  Stefan
capitain (Guest)
on 2005-12-11 17:36
(Received via mailing list)
thanks for your help , I prefer the second way :)
James G. (Guest)
on 2005-12-11 18:08
(Received via mailing list)
On Dec 11, 2005, at 2:52 AM, cap wrote:

> Log4r::Logger in context, and doing 'include Log4r' again didn't make
> the Logger turn back. The Logger is always ruby's internal Logger and
> mine "Logger[name]' can't execute now (maybe the priority of "include
> Log4r" is less than "require 'logger' ?")
>
> Is there any solution except replacing every "Logger" to
> "Log4r::Logger" in my code?

Sure, what about doing something like this:

# ...
require "bluecloth"
Logger = Log4r::Logger
# ...

James Edward G. II
This topic is locked and can not be replied to.