我需要在Log4j2周围有一个自定义包装器。基本要求是。我的应用程序应该只在任何地方使用My CustomLogger。而不是Log4j2记录器所以将来如果需要我可以轻松删除像log4j2等依赖的第三方库。
我该怎么做?
答案 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... :-)");
}
}