Reputation: 816
I am using slf4j for logging in my application. I get the purpose of slf4j. I would like to know how to find out which logging-library slf4j is currently binding to. I have log4j in my referenced libraries. I am assuming that slf4j has bound itself to log4j.
What I would like to know is, is there any way to explicitly confirm this binding?
Upvotes: 60
Views: 12787
Reputation: 5000
Easy. Put a breakpoint on .. say.. LOG.info(...). Once debugger stops there, step into.. and viola.. you will find yourself in the code of the actual logger... say log4j or logback.. whatever.
Serious answer. JVM picks up from classpath in order. Say if it encounters java.util.logging first, it will look for logging.properties configuration file. If all is well, it will use this and look no further. If not, then it will go ahead and say, find log4j.jar. JVM will look for log4j.xml. If all set, no mistakes, then this wil be selected, and so on.
You can also give hints to JVM on which configuration file to use so that the particular logger gets selected, using -D vm args. Each logger has its own.
Upvotes: 5
Reputation: 187
Or, avoiding the need to have StaticLoggerBinder (which is not part of slf4j-api):
log.info(log.getClass().getName());
In my case this prints
ch.qos.logback.classic.Logger
Upvotes: 2
Reputation: 535
It's possible to do this using the main slf4j public API (i.e. without the internal StaticLoggerBinder), e.g. to detect if slf4j has bpound to log4j2:
if ("org.apache.logging.slf4j.Log4jLoggerFactory".equals(
org.slf4j.LoggerFactory.getILoggerFactory().getClass().getName()
)
{ ... }
Upvotes: 3
Reputation: 24032
The StaticLoggerBinder
's getLoggerFactoryClassStr()
method is probably what you're looking for.
Upvotes: 8
Reputation: 340733
Just do what SLF4J does to discover the binding:
final StaticLoggerBinder binder = StaticLoggerBinder.getSingleton();
Now you can try to find out what is the actual implementation logback in my case:
System.out.println(binder.getLoggerFactory());
System.out.println(binder.getLoggerFactoryClassStr());
This prints:
ch.qos.logback.classic.LoggerContext[default]
ch.qos.logback.classic.selector.DefaultContextSelector
Upvotes: 73