我接手了一个旧的java projcet。最初的设计师走了。 在这个项目中,它以静态方式使用Log4j,如下所示:
public class LogUtil {
private static final String FQCN = LogUtil.class.getName();
private static final Logger logger1 = Logger.getLogger("INFO");
private static final Logger logger2 = Logger.getLogger("ERROR");
public static void info(Object message) {
if (logger1.isInfoEnabled()) {
forcedLog(logger1, Level.INFO, message);
}
}
public static void error(Object message) {
forcedLog(logger2, Level.ERROR, message);
}
private static void forcedLog(Logger logger, Level level, Object message) {
logger.callAppenders(new LoggingEvent(FQCN, logger, level, message, null));
}
}
然后其他类可以使用LogUtil.error("")
和LogUtil.info("")
轻松编写日志。
并且INFO记录器和ERROR记录器被配置为写入单独的文件。
但是在Log4j2中,找不到类LoggingEvent。
所以问题是,如果我想使用Log4j2,我应该如何修改这个类? (也许使用log4j2包中提供的Log4j 1.x桥?)
以这种方式使用logger是否合理?看起来它比每个类创建记录器更容易。是否存在性能或其他方面的问题?
答案 0 :(得分:1)
所以问题是,如果我想使用Log4j2,我应该如何修改这个类? (也许使用log4j2包中提供的Log4j 1.x桥?)
您 可以 重写它以使用公共API,而不是依赖底层实现细节。所以,像这样:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class LogUtil {
private static final Logger TRACE_LOGGER = LogManager.getLogger("TRACE");
private static final Logger DEBUG_LOGGER = LogManager.getLogger("DEBUG");
private static final Logger INFO_LOGGER = LogManager.getLogger("INFO");
private static final Logger WARN_LOGGER = LogManager.getLogger("WARN");
private static final Logger ERROR_LOGGER = LogManager.getLogger("ERROR");
private static final Logger FATAL_LOGGER = LogManager.getLogger("FATAL");
public static void trace(Object msg){
TRACE_LOGGER.trace(msg);
}
public static void debug(Object msg){
DEBUG_LOGGER.debug(msg);
}
public static void info(Object msg) {
INFO_LOGGER.info(msg);
}
public static void warn(Object msg){
WARN_LOGGER.warn(msg);
}
public static void error(Object msg) {
ERROR_LOGGER.error(msg);
}
public static void fatal(Object msg){
FATAL_LOGGER.fatal(msg);
}
...
}
以这种方式使用logger是否合理?看起来它比每个类创建记录器更容易。是否存在性能或其他方面的问题?
我不知道如何在一个类中添加3行是不容易的。创建记录器(在log4j2中)所需要的只是:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
...
private static final Logger logger = LogManager.getLogger();
对于潜在的问题,通过这种实现,您可以放弃log4j的许多功能。