SLF4J日志语法

8

我在一个项目中有3个开发人员,他们在写日志时有不同的风格。哪种变化最好?

LOG.info("error = {}", errmsg);
LOG.info("error = ", errmsg);
LOG.info("error = " + errmsg);
4个回答

11
LOG.info("error = {}", errmsg);

正确且最佳。

LOG.info("error = ", errmsg);

这很可能是错误的。除非 errmsg 是一个异常,否则它永远不会被记录。
LOG.info("error = " + errmsg);

这个不如第一个表现好。每次执行此行时,您都会运行String连接,而在第一种情况下,只有在实际记录语句时才会进行变量替换。
不久前,我在博客中介绍了中的不同日志记录语法。

1
我猜第二个是用于异常处理,对吗?例如:LOG.info("Error reading file", e); - m0therway
@孕妇妈妈:你说得完全正确!errmsg让我误以为这不是一个异常。已经更正了我的答案。 - Tomasz Nurkiewicz
就我个人而言,我更喜欢第三种方法,即使用字符串拼接。至于性能方面,字符串拼接可能会更快:https://dev59.com/CnNA5IYBdhLWcg3whuZ_ - Kirby
同意使用 LOG.info("error = {}", errmsg);。不应考虑其他选项。此外,参见 https://dev59.com/EGkv5IYBdhLWcg3wfA8P - Yang Liu

3

这是最好的(jcabi-log在SLF4J之上):

Logger.info(this, "error=%s", errmsg);

这是一个相对简短的替代语句:

private static Logger LOG = Logger.getLogger(Foo.class);
LOG.info(String.format("error=%s", errmsg));

首先,让一个实用的类来处理日志记录是很方便的。其次,使用String.format()进行文本格式化也非常方便,因为您始终可以看到整个字符串并且能够轻松地翻译它。


2

第一种形式的修改是最好的。

log.info("error={}", errmsg);

其他人已经说过了,第二个示例必须是一个错误,因为没有格式标记可以将errmsg插入到"error = "中,除非errmsg是一个Throwable并且启用了info级别日志记录。然后记录器会打印堆栈跟踪。
多年来,我更喜欢第三种形式的字符串连接。当我回来阅读代码时,我发现它更容易阅读。
然而,正如Tomasz Nurkiewicz所回答的那样,第一种形式LOG.info("error={}", errmsg);是最好的。原因不是因为String.format()比字符串连接更快。它不是。请参见在Java中使用String.format还是字符串连接更好的做法?
第一种形式的性能更好的原因是:如果禁用了info级别的日志记录,则日志记录框架不必调用errmsg.toString(),也不必执行String.format()。唯一的情况是errmsg.toString()没有性能损失的情况是errmsg是一个字符串。
我还建议在=周围没有空格,因为许多日志聚合器(如Splunk)将error = errmsg自动索引到字段和值对中。此外,如果这真的是一个错误,那么我会将其写入error()级别,而不是info()级别。最可能是在此代码之前有一个Throwable异常,应该放进Throwable参数中。
另外,虽然logger很可能被声明为final,但它是一个可变对象,所以应该用小写字母表示。请参见“static final Logger”应该声明为大写字母吗?
这意味着答案确实应该是:
log.info("error={}", errMsg, exception);

有趣的是,自从写下这个答案后,我现在不同意自己了。更新中。 - Kirby

0

以下是从实际的slf4j javadoc中精确复制的内容。值得访问这里:http://www.slf4j.org/api/org/slf4j/Logger.html

import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;

 public class Wombat {

   final static Logger logger = LoggerFactory.getLogger(Wombat.class);
   Integer t;
   Integer oldT;

   public void setTemperature(Integer temperature) {
     oldT = t;
     t = temperature;
     logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);
     if(temperature.intValue() > 50) {
       logger.info("Temperature has risen above 50 degrees.");
     }
   }
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接