当前位置: 首页 > 知识库问答 >
问题:

我可以在Log4j2中按级别而不是按类创建记录器吗?

马安邦
2023-03-14

我接手了一个旧的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编写日志。错误(“”)LogUtil。信息(“”)。信息记录器和错误记录器被配置为写入不同的文件。

但是在Log4j2中,找不到LoggingEvent类。

所以问题是,如果我想使用Log4j2,我应该如何修改这个类?(可能使用log4j2包中提供的Log4j 1.x桥?)

这样使用记录器合理吗?似乎比每个类创建记录器更容易。是否存在性能或其他问题?

共有1个答案

解飞语
2023-03-14

所以问题是,如果我想使用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的很多功能。

  1. 不能在包或类的基础上更改日志级别,因为所有类都共享相同的记录器。也许您想为正在工作的新类打开跟踪日志记录,但您不想从其他类中获取任何跟踪日志,因为它会使日志文件变得杂乱无章——您无法轻松进行此类更改
  2. 不能在包或类的基础上更改appender,因为所有类再次共享相同的记录器。也许您希望将正在处理的新包中的所有日志发送到一个单独的文件中,这样您就可以更容易地看到新代码正在做什么,而不必手动过滤日志。也许您希望在开发过程中在单个文件中查看特定类或包中的所有日志,这样您就可以更轻松地跟踪执行,而不必跳转到不同的文件
 类似资料:
  • 我的团队使用来控制我们的, 在中,我们可以选择更改中的级别, 我们为每个(线程)有一个单独的记录器,如果我们想只看到一个线程的控制台日志,我们关闭所有其他线程记录器,问题是每个记录器都为和某个文件发送输出,我们只想关闭stdout输出。 log4j2.xml配置示例: 我们尝试了很多解决方案: 将父记录器与可加性结合使用,并将每个附加器分离到不同的记录器,对此有什么想法吗?

  • 问题内容: 因此,我正在尝试学习log4j2,并把头放在记录器及其级别和父母传播上。 当前,我的源层次结构运行是: 而我的CalculatorMain是: 我的log4j2.xml是 问题是将输出到控制台的root记录程序设置为。根据我对级别的理解,这意味着我的root记录器应仅输出错误日志或更低的错误日志。然后是我的 记录器,前者应仅记录错误并降低记录,而后者应记录跟踪并降低记录。因此,我的理解

  • 问题内容: 有人可以告诉我,如何在类级别调用方法吗? 假设我有一个如下所示的类,那么我们可以在类级别调用test1Method吗?如果不正确,请告诉我原因。 问题答案: 不,您不能在类下直接拥有方法调用语句或任何其他语句。根据JLS第8节-类的规定: 类的主体声明成员(字段和方法以及嵌套的类和接口),实例和静态初始化器以及构造函数(第8.1.6节)。 您必须在那些成员(某些方法),初始化程序或构造

  • 我正在尝试通过代码添加一个自定义的附加器,该附加器应该记录一些包。所有的工作都使用以下代码: 所以简而言之..正如您所看到的,如果之前没有定义追加器,我正在创建一个追加器。然后我为org.test创建一个记录器(如果没有添加的话),并将appender添加到这个记录器中。 多谢了。

  • 问题内容: 如何配置JSch记录器的级别? 是否可以通过XML配置Log4J? 问题答案: JSch似乎没有使用任何已知的日志记录框架(我使用JSch v0.1.49,但最新版本是v0.1.51)或任何XML配置文件。所以这就是我所做的: 然后在使用JSch之前: 请注意,您可以使用所需的任何日志记录框架类(Log4j,Logback等)来代替and , 您可以在此处获得完整的示例:http :