slf4j日志语法

时间:2012-08-31 20:21:18

标签: logging slf4j

我在项目中有3个开发人员在写入日志时有不同的样式。哪种变体最好?

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

4 个答案:

答案 0 :(得分:8)

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

正确且最好。

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

这很可能是错误的。除非errmsg是例外,否则永远不会记录它。

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

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

前一段时间I blogged关于中的不同日志记录语法。

答案 1 :(得分: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 :(得分:1)

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

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

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

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

但是,当Tomasz Nurkiewicz回答时,第一种形式LOG.info("error={}", errmsg);是最好的。但是,原因并不是String.format()比字符串连接更快。事实并非如此。见Is it better practice to use String.format over string Concatenation in Java?

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

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

而且,Throwable虽然可能被声明为logger,但它是一个可变对象,所以它应该是小写的。请参阅Should a "static final Logger" be declared in UPPER-CASE?

这意味着答案应该是

final

答案 3 :(得分: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.");
     }
   }
 }