【问题标题】:slf4j logging syntaxslf4j 日志记录语法
【发布时间】:2012-08-26 15:56:53
【问题描述】:

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

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

【问题讨论】:

    标签: logging slf4j


    【解决方案1】:
    LOG.info("error = {}", errmsg);
    

    正确且最好。

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

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

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

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

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

    【讨论】:

    • 我猜第二个用于例外,对吧?例如LOG.info("读取文件错误", e);
    • @Pregnantmom:你说得对! errmsg 让我相信这不是个例。更正了我的答案。
    • 我个人更喜欢使用字符串连接的第三个。至于性能,字符串连接可以更快:stackoverflow.com/questions/925423/…
    • 同意,应该使用LOG.info("error = {}", errmsg);。不应考虑其他选项。还有stackoverflow.com/questions/10555409/…
    【解决方案2】:

    这是最好的(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() 进行文本格式化非常方便,因为您始终可以看到整个字符串并且可以轻松翻译它。

    【讨论】:

      【解决方案3】:

      改变第一种形式是最好的

      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(),也不必执行String.format()errmsg.toString() 没有性能成本的唯一情况是 errmsgString

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

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

      这意味着答案应该是

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

      【讨论】:

      • 有趣,自从写了这个答案,我现在不同意自己。更新
      【解决方案4】:

      以下是实际 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.");
           }
         }
       }
      

      【讨论】:

        猜你喜欢
        • 2011-11-07
        • 1970-01-01
        • 2012-06-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-28
        • 2021-05-26
        • 2013-01-21
        • 2011-01-23
        相关资源
        最近更新 更多