gpt4 book ai didi

java - 为什么不建议每次都调用 LoggerFactory.getLogger(...)?

转载 作者:IT老高 更新时间:2023-10-28 20:42:16 25 4
gpt4 key购买 nike

我已经阅读了大量帖子和文档(在本网站和其他地方),指出 SFL4J 日志记录的推荐模式是:

public class MyClass {
final static Logger logger = LoggerFactory.getLogger(MyClass.class);

public void myMethod() {
//do some stuff
logger.debug("blah blah blah");
}
}

我的老板更喜欢我们只使用包装器来拦截日志调用,并避免在每个类上声明记录器的样板代码:

public class MyLoggerWrapper {
public static void debug(Class clazz, String msg){
LoggerFactory.getLogger(clazz).debug(msg));
}
}

并像这样简单地使用它:

public class MyClass {

public void myMethod() {
//do some stuff
MyLoggerWrapper.debug(this.getClass(), "blah blah blah");
}
}

我认为每次记录时都实例化一个记录器有点昂贵,但我一直找不到任何支持该假设的文档。此外,他说框架(我们仍在决定的 LogBack 或 Log4J)肯定会“缓存”记录器,而且在任何情况下,服务器的运行都远远低于其容量,所以这不是问题。

任何帮助指出这种方法的潜在问题?

最佳答案

这种方法有一个明显的问题:字符串消息将在每次调用 debug() 时构建,没有明显的方法可以在包装器中使用保护子句。

log4j/commons-logging/slf4j 的标准习惯用法是使用保护子句,例如:

if (log.isDebugEnabled()) log.debug("blah blah blah");

目的是如果没有为记录器启用 DEBUG 级别,编译器可以避免将您可能发送的任何更长的字符串连接在一起:

if (log.isDebugEnabled()) log.debug("the result of method foo is " + bar 
+ ", and the length is " + blah.length());

"What is the fastest way of (not) logging?" in the SLF4Jlog4j常见问题解答。

我建议不要使用您老板建议的“包装”。像 slf4j 或 commons-logging 这样的库已经是实际使用的底层日志实现的外观。此外,记录器的每次调用都会变得更长 - 将上述内容与

进行比较
 MyLoggerWrapper.debug(Foo.class, "some message");

这是一种琐碎且不重要的“包装”和混淆,除了添加间接层和丑陋的代码之外,没有任何实际用途。我认为你的老板可以找到更重要的问题来解决。

关于java - 为什么不建议每次都调用 LoggerFactory.getLogger(...)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3923971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com