如果我们在集中式日志记录类的日志记录语句中使用以下内容,会对性能产生什么影响。
class LogUtil {
public static debug(String message) {
LoggerFactory.getLogger(Thread.currentThread().getStackTrace()[2].getClassName ()).debug(message);
}
}
我正在使用SLF4J和log4j2。
答案 0 :(得分:0)
我不知道为什么你不遵循log4j中提供的示例。如果你真的想要一种集中的方式来进行日志记录,那么你应该尝试面向方面的编程,比如aspect4j。
我在这里看到的是两个会对您产生影响的地方:
答案 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获取位置信息的方法通常比这里要快得多。