Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

ruby's Logger conflict with Log4r's Logger

134 views
Skip to first unread message

cap

unread,
Dec 11, 2005, 3:50:38 AM12/11/05
to
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?

Stefan Lang

unread,
Dec 11, 2005, 6:22:48 AM12/11/05
to
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


cap

unread,
Dec 11, 2005, 10:00:38 AM12/11/05
to
thanks for your help , I prefer the second way :)

James Edward Gray II

unread,
Dec 11, 2005, 10:44:12 AM12/11/05
to

Sure, what about doing something like this:

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

James Edward Gray II


0 new messages