58

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?

Tomasz Nurkiewicz
  • 334,321
  • 69
  • 703
  • 674
psykeron
  • 796
  • 1
  • 6
  • 14
  • 1
    I swear there was a way to turn on slf4j debugging (meta debugging) but I can't remember what it was. None of the answers address that. – Sridhar Sarnobat Jan 15 '19 at 23:25

5 Answers5

72

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
Tomasz Nurkiewicz
  • 334,321
  • 69
  • 703
  • 674
8

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

leedm777
  • 23,444
  • 10
  • 58
  • 87
4

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.

Apurva Singh
  • 4,534
  • 4
  • 33
  • 42
3

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()
) 
{ ... }
Ben Spiller
  • 477
  • 4
  • 12
1

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