我正在接管一个旧的Java项目。原来的设计师已经走了。
在此项目中,它以静态方式使用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网桥?)
以这种方式使用记录器是否合理?似乎比按类创建记录器要容易。有性能或其他问题吗?
最佳答案
所以问题是,如果要使用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);
}
...
}
以这种方式使用记录器是否合理?似乎比按类创建记录器要容易。有性能或其他问题吗?
除了简单之外,我看不到在课程中添加3行。创建记录器(在log4j2中)所需要的全部是这样的:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
...
private static final Logger logger = LogManager.getLogger();
对于潜在的问题,使用此实现,您将放弃log4j的许多功能。
您不能基于包或类更改日志级别,因为所有类都共享相同的记录器。也许您想为正在处理的新类打开TRACE日志记录,但是您不希望其他类的任何TRACE日志记录变得混乱,因为这会使日志文件混乱-您将无法轻松进行此类更改。
您不能基于包或类更改附加程序,因为所有类再次共享相同的记录器。也许您想将所有正在处理的新软件包中的日志发送到一个单独的文件中,以便您可以更轻松地查看新代码在做什么,而不必手动过滤日志。也许您希望在开发过程中在一个文件中查看特定类或程序包的所有日志,以便您可以更轻松地跟踪执行过程,而不必跳转到其他文件。