7

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

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

4 回答 4

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

正确和最好的。

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

这很可能是错误的。除非errmsg是异常,否则永远不会被记录。

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

这个表现不如第一个。每次点击此行时都会运行String连接,而在第一种情况下,只有在实际记录语句时才会发生变量替换。

前段时间我在博客上写了中不同的日志记录语法。

于 2012-08-31T20:25:35.433 回答
3

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

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

这是一个简短的替代方案:

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

首先,让一个实用程序类来处理记录器实例化很方便。其次,它用于文本格式非常方便String.format(),因为您始终可以看到整个字符串并且可以轻松翻译它。

于 2012-10-05T06:09:32.123 回答
2

第一种形式的改变是最好的

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

正如其他人所说,第二个示例必须是一个错误,因为没有要插入的格式标记errmsg"error = "除非启用errmsgThrowableinfo级别的日志记录。然后记录器将打印一个 stracktrace。

多年来,我更喜欢第三种形式的字符串连接。几个月或几年后,当我回去阅读代码时,我发现阅读起来更容易。

然而,正如Tomasz Nurkiewicz回答的那样,第一种形式LOG.info("error={}", errmsg);是最好的。但是,原因不在于String.format()它比字符串连接更快。它不是。请参阅在 Java 中使用 String.format 而非字符串连接是否更好?.

第一种形式表现更好的原因是,如果info禁用级别日志记录,那么日志记录框架就不必调用 errmsg.toString() ,也不必执行String.format()。唯一errmsg.toString()没有性能成本的情况是 iferrmsg是 a String

我还建议=像 Splunk 这样的日志聚合器周围没有空格会自动索引error=errmsg到字段和值对。另外,如果这确实是一个错误,那么我会将其写入error()级别,而不是info(). 并且很可能Throwable在此代码之前的某个地方存在应该进入Throwable参数的异常。

而且,logger虽然它可能被声明为final,但它是一个可变对象,所以它应该是小写的。请参阅是否应以大写形式声明“静态最终记录器”?.

这意味着答案真的应该是

log.info("error={}", errMsg, exception);
于 2014-11-25T17:08:03.197 回答
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.");
     }
   }
 }
于 2014-07-02T22:51:34.110 回答