使用Log4j2对SLF4J getLogger性能产生影响

时间:2015-02-25 16:21:28

标签: slf4j log4j2

如果我们在集中式日志记录类的日志记录语句中使用以下内容,会对性能产生什么影响。

class LogUtil {
    public static debug(String message) {
        LoggerFactory.getLogger(Thread.currentThread().getStackTrace()[2].getClassName  ()).debug(message);
    }
}

我正在使用SLF4J和log4j2。

3 个答案:

答案 0 :(得分:0)

我不知道为什么你不遵循log4j中提供的示例。如果你真的想要一种集中的方式来进行日志记录,那么你应该尝试面向方面的编程,比如aspect4j。

我在这里看到的是两个会对您产生影响的地方:

  1. 您正在获取当前线程的堆栈跟踪,与简单的Class.getName()
  2. 相比,这可能非常耗时
  3. 您将从堆栈跟踪中获取一个元素,然后从其类名称
  4. 获取

答案 1 :(得分:0)

LoggerFactory.getLogger(..)相比,SLF4J Logger.debug(..)的意图被召唤的次数很少。方法getLogger(..)在返回Logger实例之前可以进行大量的簿记,因此最好避免这种模式(或至少读取Java源代码)。

SLF4J已经进行了集中记录"。但如果需要,您可以创建自己的外观,例如:

public class MyLoggerFactory {
    public static MyLogger getLogger() {
        final Logger logger = LoggerFactory.getLogger(
                  Thread.currentThread()
                        .getStackTrace()[2]
                        .getClassName());
        return new MyLogger(logger);
    }
}

public class MyLogger {
    private final Logger logger;

    class MyLogger(Logger logger) { this.logger = logger; }

    public void debug(Object message) {
        logger.debug(message);
    }
}

class SomeClass {
    private static final MyLogger logger = MyLoggerFactory.getLogger();

    public void method() {
         logger.debug("Log something");
    }
}

答案 2 :(得分:0)

这种方法的另一个缺点是Log4j的位置信息将指向LogUtil类中的调试方法,这似乎是您要复制的内容。 Log4j获取位置信息的方法通常比这里要快得多。