psykeron
psykeron

Reputation: 816

How to find which library slf4j has bound itself to?

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

Answers (5)

Apurva Singh
Apurva Singh

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

Tumelo Galenos
Tumelo Galenos

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

Ben Spiller
Ben Spiller

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

leedm777
leedm777

Reputation: 24032

The StaticLoggerBinder's getLoggerFactoryClassStr() method is probably what you're looking for.

Upvotes: 8

Tomasz Nurkiewicz
Tomasz Nurkiewicz

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

Related Questions