我可以在每个级别的Log4j2中创建记录器,而不是每个类?

时间:2017-03-09 08:54:29

标签: java logging log4j log4j2

我接手了一个旧的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是否合理?看起来它比每个类创建记录器更容易。是否存在性能或其他方面的问题?

1 个答案:

答案 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的许多功能。

  1. 您无法更改包或类的日志级别,因为所有类共享相同的记录器。也许您想要为正在处理的新类启用TRACE日志记录,但是您不希望来自其他类的任何TRACE日志因为它使日志文件变得混乱 - 您将无法轻松地进行此类更改。
  2. 您无法在包或类的基础上更改appender,因为所有类都会共享相同的记录器。您可能希望将正在处理的新软件包中的所有日志发送到单独的文件,以便您可以更轻松地查看新代码的操作,而无需手动过滤日志。也许您希望在开发过程中在单个文件中查看特定类或包中的所有日志,以便您可以更轻松地执行执行,而无需跳转到不同的文件。