The Simple Logging Façade for Java (SLF4J) serves as a simple façade or abstraction for various logging frameworks, such as java.util.logging, logback and log4j. SLF4J allows the end-user to plug in the desired logging framework at deployment time. It enables a generic API making the logging independent of the actual implementation.
NOPLogger(org.slf4j.helpers.NOPLoggerFactory) - All logging will be silently discarded. Starting with version 1.6.0, if no binding(logger implementation) is found on the classpath, this one will be used by default.
SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#noProviders for further details.
Log4j(org.slf4j.log4j12.Log4jLoggerFactory) - A wrapper over the Log4j’s Logger
Java Util Logging(org.slf4j.jul.JDK14LoggerFactory) - wrapper for the Java Util Logging logger
Logback Logging Framework(ch.qos.logback.classic.LoggerContext) - Wrapper for Logback Logging Framework
Dependencies:
SLF4J API Dependency:
slf4j-api
Implementation Dependencies:
SimpleLogger:
slf4j-simple
The logger configuration can be enabled by adding "simplelogger.properties" file to the class path(src/main/resources)
simplelogger.properties
org.slf4j.simpleLogger.logFile=System.out
org.slf4j.simpleLogger.defaultLogLevel=warn
Log4j:
slf4j-log4j12
While enabling Log4j logging Framework, the log4j.proerties should be added into the classpath(src/main/resources), sample log4j file
log4j.properties
log4j.rootLogger=info, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
Java Util Logging:
slf4j-jdk14
The default logger configuration is available in $JAVA_HOME/conf/logging.properties, custom logging.properties can be enabled if required(there are multiple ways to load the custom logging.properties - JVM parameter - -Djava.util.logging.config.file=logging.properties, System.setProperty("java.util.logging.config.file", "logging.properties"); etc)
logging.properties
handlers= java.util.logging.ConsoleHandler
.level= INFO
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
com.demo.logging.level=INFO
Logback Logging Framework
logback-classic
The logger configuration can be enabled by adding "logback.xml" file to the class path(src/main/resources)
class="ch.qos.logback.core.ConsoleAppender">
%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
Ensure only one implementation is enabled to the project, the latest SLF4J versions use the first implementation loaded as the actual implementation.
SLF4J: Class path contains multiple SLF4J providers.
SLF4J: Found provider [ch.qos.logback.classic.spi.LogbackServiceProvider@34b7bfc0]
SLF4J: Found provider [org.slf4j.jul.JULServiceProvider@366e2eef]
SLF4J: Found provider [org.slf4j.simple.SimpleServiceProvider@6df97b55]
SLF4J: Found provider [org.slf4j.log4j12.Log4j12ServiceProvider@3cbbc1e0]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual provider is of type [ch.qos.logback.classic.spi.LogbackServiceProvider@34b7bfc0]
Some of the time, we may have the use case to identify the logging implementation SLF4J is using to log the messages, this can be easily identified by looking into the logger implementation dependency added to the project. But sometimes the dependencies may come from external projects, the below APIs can be used to identify the same.
//
org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(Application.class);
System.out.println(logger.getClass());
Output - class org.slf4j.simple.SimpleLogger
//
LoggerFactory.getILoggerFactory().getClass().getName()
Output - ch.qos.logback.classic.LoggerContext
//
In earlier versions, even the below API is supported
org.slf4j.impl.StaticLoggerBinder.getSingleton().getLoggerFactory()
Output - ch.qos.logback.classic.LoggerContext[default]