Difference between slf4j-log4j12 vs log4j

19.5k views Asked by At

In a project's pom.xml I am seeing a dependency like below

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.5</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.5</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>

Can someone let me know what is the difference between slf4j-log4j12 & log4j ?

4

There are 4 answers

3
glytching On BEST ANSWER

Log4j 1.2

slf4j-log4j12 provides a bridge between SLF4J and Log4j 1.2 so that SLF4J knows about how to log using Log4j.

You are using Log4j 1.2. That version's binding it is maintained by the SLF4J project. Here is a summary from the SLF4J docs:

SLF4J supports various logging frameworks. The SLF4J distribution ships with several jar files referred to as "SLF4J bindings", with each binding corresponding to a supported framework.

slf4j-log4j12-1.7.28.jar

Binding for log4j version 1.2, a widely used logging framework. You also need to place log4j.jar on your class path.

Log4j 2

If you are using Log4j 2 or later, you will need a different binding JAR than slf4j-log4j12. That binding is maintained by the Log4j project. According to the Log4j docs:

The Log4j 2 SLF4J Binding allows applications coded to the SLF4J API to use Log4j 2 as the implementation.

You must provide both dependencies if you want SLF4J to route logging to Log4j. Again, from the Log4j 2 docs:

Simply include the Log4j 2 SLF4J Binding jar along with the Log4j 2 jars and SLF4J API jar to cause all SLF4J logging to be handled by Log4j 2.

0
Dinesh Kumar On

Slf4j:

An abstract layer for the logging component. We can change logging at point of time without much changes in code.

Log4j:

A logging component which provides core functionalities of logging.

2
Arvind Katte On

I'll post some points regarding these logger message.

log4j:

logger.debug("This is log message:" + msg);

log4j string is concatenated every time the line is evaluated even if log level is lower than debug so the string will never be used.

slf4j:

logger.debug("this is log slf4j message",msg);

slf4j string and parameters are passed through to the logger which only substitutes them if the log message is actually to be used.

The only difference is the performance. Where log4j will take more time because of string concatenation compare to slf4j.

1
trallnag On

To summarize:

 <dependency> <!--Facade for logging systems-->
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-api</artifactId>
   <version>1.7.25</version>
 </dependency>

 <dependency> <!--Log4j 2 implementation for slf4j-->
   <groupId>org.apache.logging.log4j</groupId>
   <artifactId>log4j-slf4j-impl</artifactId>
   <version>2.12.0</version>
 </dependency>

In addition make sure that you are using a log4j2 properties file. The mistake of using 'log4j.xml' did cost me quite some time