需要在log4j2中实现Custom Logger Wrapper

时间:2014-11-28 05:07:42

标签: java logging log4j log4j2

我需要在Log4j2周围有一个自定义包装器。基本要求是。我的应用程序应该只在任何地方使用My CustomLogger。而不是Log4j2记录器所以将来如果需要我可以轻松删除像log4j2等依赖的第三方库。

我该怎么做?

2 个答案:

答案 0 :(得分:6)

Log4j2附带了一个用于生成自定义记录器包装器的工具: 见http://logging.apache.org/log4j/2.0/manual/customloglevels.html#CustomLoggers

此工具旨在用于自定义日志级别,但您也可以将其用于您的目的。如果要完全删除对log4j2 api的所有引用,可能需要删除一些方法,但它仍然可以为您节省大量工作。

答案 1 :(得分:2)

Log界面

首先,您需要在每个应用程序类中使用一个接口。 e.g:

public interface Log {

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

}

包装类

创建一个实现该接口的类。它是log4j的包装器,例如:

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);
    }

}

LogFactory类。

要创建每个Log,请使用工厂。 e.g:

public class LogFactory {

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

}

用法示例

Log的每个实例的此工厂用于您的应用程序。 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... :-)");
    }

}