Satyam Soni
Satyam Soni

Reputation: 103

Need to implement Custom Logger Wrapper in log4j2

I need to have an Custom Wrapper around Log4j2. The basic requirement is that. My application should only use My CustomLogger everywhere. instead of Log4j2 logger so in future if needed i can remove 3rd party library like log4j2 etc dependency easily.

How can i do this ??

Upvotes: 6

Views: 9417

Answers (2)

Remko Popma
Remko Popma

Reputation: 36754

Log4j2 comes with a tool for generating custom logger wrappers: See http://logging.apache.org/log4j/2.0/manual/customloglevels.html#CustomLoggers

This tool was intended for use with custom log levels but you can also use it for your purpose. There are a few methods you may want to remove if you want to completely remove all references to the log4j2 api, but it will still save you a lot of work.

Upvotes: 7

Paul Vargas
Paul Vargas

Reputation: 42020

The Log interface

First, you requires an interface to be used in each class of application. e.g.:

public interface Log {

    boolean isInfoEnabled();    
    void info(String str);
    void info(String str, Throwable t);

}

The wrapper class

Create a class that implements that interface. It's the wrapper for log4j, e.g.:

class Log4jWrapper implements Log {

    private static final String FQCN = Log4jWrapper.class.getName();
    private ExtendedLoggerWrapper log;

    public Log4jWrapper(Class<?> clazz) {
        Logger logger = LogManager.getLogger(clazz);
        log = new ExtendedLoggerWrapper((ExtendedLogger) logger, 
                logger.getName(), logger.getMessageFactory());
    }

    public boolean isInfoEnabled() {
        return log.isInfoEnabled();
    }

    public void info(String str) {
        log.logIfEnabled(FQCN, Level.INFO, null, new SimpleMessage(str), null);
    }

    public void info(String str, Throwable t) {
        log.logIfEnabled(FQCN, Level.INFO, null, new SimpleMessage(str), t);
    }

}

The LogFactory class.

To create each Log, use a factory. e.g.:

public class LogFactory {

    public static Log getLog(Class<?> clazz) {
        return new Log4jWrapper(clazz);
    }

}

Usage example

Use this factory for each instance of Log into your application. e.g.:

public class Test {

    private static final Log LOG = LogFactory.getLog(Test.class);

    public static void main(String[] args) {
        LOG.info("This is a test... :-)");
    }

}

Upvotes: 3

Related Questions