Commons-logging with log4j2

user3207875 picture user3207875 · Jan 4, 2017 · Viewed 9.5k times · Source

I am using log4j 1.2 with commons-logging. Now I am trying to upgrade it to log4j2. But how to use log4j2 with commons-logging to initialize log4j2.

I tried to initialize commons logging in the below way. Its working fine

**Statement1**: static Log log = new Log4JLogger(Logger.getLogger(Example.class));
**Statement2**:log.debug("debug statement");

Here I am using object of type org.apache.commons.logging.Log initialized with object of org.apache.log4j.Logger.(org.apache.log4j.Logger is the class from log4j 1.2 where as from log4j2 is changed to org.apache.logging.log4j.Logger)

Now after I upgrade to log4j2, Statement1 will not work as Log4JLogger() constructor expects argument of type org.apache.log4j.Logger type.

So, how do I use commons logging with Log4j2?

Answer

Remko Popma picture Remko Popma · Jan 5, 2017

You need to add the log4j-jcl-2.7 dependency to your classpath.

See the "which jars" question in the FAQ.

In your code, use

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 

public class MyClass {
    private Log log = LogFactory.getLog(MyClass.class);
    ...

You should not explicitly use Log4JLogger.

Also, be aware that Log4j2 is different from Log4j 1 in that it offers a clean separation between its API and its implementation. So the benefits of using a wrapper library are much less now than they were 10 years ago with Log4j 1.

Consider using the Log4j2 API directly: it gives you the same separation between API and implementation and is more feature rich than commons logging or slf4j.

Note that there is little risk in using the Log4j2 API directly: the log4j-to-slf4j-2.x module is always there in case you change your mind and decide to use Logback (or another slf4j implementation) with an application that directly uses the Log4j2 API.