【问题标题】:Which is the best way to declare logger variable in java哪个是在java中声明记录器变量的最佳方法
【发布时间】:2012-02-04 02:34:44
【问题描述】:

我只是想知道在 java 中声明 logger 变量的最佳方式是什么。 以下是一些声明。

1> private static final Logger logger = Logger.getLogger(ServiceImpl.class);

2> private static Logger logger = Logger.getLogger(ServiceImpl.class);

3> private static final Logger LOGGER= Logger.getLogger(ServiceImpl.class);

4> private static Logger LOGGER= Logger.getLogger(ServiceImpl.class);

P.S 如果有人知道声明 looger 变量的另一种最佳替代方法,我真的很感激。

【问题讨论】:

标签: java logging


【解决方案1】:

第一个最好。我更喜欢记录器是finalstatic....

【讨论】:

  • @abhutra:感谢您的快速回复。但是 PMD 规则说静态最终变量应该是大写。
【解决方案2】:

我会选择第一个选项,但我想这是个人选择的问题。

【讨论】:

  • 但是 PMD 规则说静态最终变量应该是大写
  • @Raje:在这种情况下,PMD 故意变得迟钝。查看 Java 标准库类(例如 System)中不是“真实”常量(即不是原始或 String)的任何静态最终字段。他们不对这些变量使用大写名称。
【解决方案3】:

我投票给3

 private static final Logger LOGGER = Logger.getLogger(ServiceImpl.class);

它是final,因为你没有更改它,它是大写的,因为它是一个常量。

【讨论】:

  • 它不应该是大写的。 “Java Coding Style Guide”,“Google Java Style”说,它应该是小写的“logger”。这里正在讨论:stackoverflow.com/q/1417190/603314
【解决方案4】:

所有大写的变量名都是 IMO 出来的,因为您实际上不是在声明/定义一个常量,而是一个静态变量。大写名称更适合“常量”。也就是说,我个人会采用第一种方法。

private static final Logger logger = Logger.getLogger(ServiceImpl.class);

【讨论】:

  • 我完全同意你的说法。另外,当您拥有 LOGGER 时,该变量似乎只是在向您尖叫以引起您的注意,这不应该发生。
【解决方案5】:

在我对 java 风格指南的理解中,'logger' 是最好的。 'LOGGER' 将用于定义的常量。

此外,使用“final”应该会使其更快一些。

因此#1。

【讨论】:

    【解决方案6】:

    我个人认为private static final Logger LOGGER= Logger.getLogger(ServiceImpl.class); 是出于语义和性能原因的最佳方式:

    • 您的日志属于该类而不是它的各种实例,因此您应该将其设为静态
    • 它应该是私有的,因为它由类内部使用,它不是它的公共 API 的一部分
    • 将其设为最后两个是有意义的,首先是因为这表明引用不会改变(这里就是这种情况),其次是因为最终实例变量(尤其是静态变量)可以通过编译器和JIT(更多详情 here
    • 将其全部命名为大写实际上只是一个很好的约定,这就是在 Java 中声明静态变量的方式,这不是必须的,但它使代码更具可读性

    【讨论】:

      【解决方案7】:

      我建议不要在每个类中都使用这样的变量,而是将这项工作委托给 slf4j 的静态实用程序包装器,来自 jcabi-log

      Logger.debug(this, "some variable = %s", value);
      

      也请查看此帖子:http://www.yegor256.com/2014/05/23/avoid-java-static-logger.html

      【讨论】:

      • 虽然如果您想在日志语句中包含调用者的文件名和行,而不是实用程序类中的位置,那么实现起来有点棘手。但实际上使用org.slf4j.spi.LocationAwareLogger 是可行的。
      【解决方案8】:

      在特定类的所有实例之间共享单个记录器对象并在程序期间使用相同的记录器是一种很好的编程习惯,因此我们使用staticfinal 记录器。

      不建议使用多个记录器(糟糕的记录习惯)而不是记录级别。

      我认为

      private static final Logger logger = Logger.getLogger(ServiceImpl.class);
      

      是更好的选择。

      【讨论】:

      • 问题中的所有记录器声明都已经是static并声明为一个变量,问题是询问它是否应该是final并以UPPERlower命名。
      【解决方案9】:

      这里没有人使用LOGlog?我发现它在实践中更好。 (当然我不是第一个在这个标准的地方工作的人,因为 Lombok 中的 @Log4j 也会生成一个 log 字段。当然它也是静态最终的。顺便说一句,这是声明的最佳方式该字段...添加@Log4j 注释。完成。)

      【讨论】:

        【解决方案10】:

        private static final Logger LOGGER = Logger.getLogger(NameClass.class.getName());

        其中 logger 是最终的,已解决的变量应以大写形式定义。 虽然 getLogger() 静态方法需要 String 作为参数,但类名也应该调用类的 .getName()。

        【讨论】:

          【解决方案11】:

          @Slf4j 注释可以帮助解决这个问题。

          import lombok.extern.slf4j.Slf4j;
          @Slf4j
          public class CustomClassName {
           void customMethod(){
            log.info("Shorthand logger annotation example");
           }
          }
          

          【讨论】:

            猜你喜欢
            • 2016-05-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-12-01
            • 2021-10-31
            • 1970-01-01
            • 2016-09-18
            相关资源
            最近更新 更多