ruby's Logger conflict with Log4r's Logger

C

cap

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?
 
S

Stefan Lang

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
 
J

James Edward Gray II

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?

Sure, what about doing something like this:

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

James Edward Gray II
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,048
Latest member
verona

Latest Threads

Top