在Java中声明日志记录器变量的最佳方法是什么?

14

我只想知道在Java中声明日志记录器变量的最佳方式是什么。 以下是一些声明。

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);

顺便说一下,如果有人知道另外一种更好的声明logger变量的方法,我会非常感激。


2
由你决定,但你应该选择“final”版本。 - fge
可能是重复的问题:应该把“static final Logger”声明为大写吗? - dogbane
12个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
14

我认为全部使用大写字母的变量名不太合适,因为你并没有在声明/定义一个常量,而是一个静态变量。大写字母的变量名更适用于“常量”。话虽如此,个人而言,我会选择第一种方法。

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

3
我完全同意你的说法。此外,当你有LOGGER时,它似乎就像那个变量在向你呼喊寻求注意,这是不应该发生的。 - Jeach

6

我投票支持3

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

由于您不会更改它且它是常量,因此它是“final”(最终)的,并且由于它是常量,所以它是大写字母。


1
它不应该是大写字母。 "Java编码风格指南","Google Java风格"表明,它应该是小写字母"logger"。正在这里讨论:https://dev59.com/l3M_5IYBdhLWcg3wWRoF - bugs_

3

我个人认为private static final Logger LOGGER= Logger.getLogger(ServiceImpl.class);是语义和性能方面最好的选择:

  • 你的日志属于类而不是其各个实例,因此应该将其设置为静态。
  • 它应该是私有的,因为它仅在类内部使用,不属于其公共API的一部分。
  • 将其设置为final也是有意义的,首先这表明引用不会改变(在这种情况下是这样),其次,final实例变量(特别是静态变量)可以通过编译器和JIT更好地进行速度优化(更多细节请参见此处)。
  • 全部大写命名只是一个良好的约定,这是Java中声明静态变量的方式,虽然不是必须的,但它使代码更易读。

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

但是PMD规则指出,静态final变量应该大写。 - Raje
1
@Raje:在这种情况下,PMD是故意变得晦涩难懂的。查看Java标准库类(例如System)中的任何静态final字段,这些字段不是“真正”的常量(即不是原始类型或String)。它们不使用大写字母命名这些变量。 - Sanjay T. Sharma

0

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

日志记录器是一个终态变量,应该使用大写进行定义。 同时,getLogger() 静态方法需要传入一个字符串参数,类的名称应该通过调用 .getName() 方法获取。


0

第一个是最好的。我更喜欢将记录器设置为finalstatic....


@abhutra:感谢您的快速回复。但是PMD规则指出,静态final变量应该大写。 - Raje

0
在我理解的Java风格指南中,使用'logger'最好。'LOGGER'应该是用于定义常量。 此外,使用'final'可以使它变得更快。 因此,这是第一点建议。

0
这里没有人使用 LOG 或者 log 吗?我发现实际应用中更好用。(我肯定不是第一个在工作中遵循标准的人,因为 Lombok 中的 @Log4j 也会生成一个 log 字段。当然,它也是静态常量。顺便说一下,那是声明该字段最好的方法... 添加一个 @Log4j 注释。完成了。)

0

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

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

0

虽然如果你想在日志语句中记录调用者的文件名和行号,而不是来自实用类的位置,那么这有点棘手。但是通过利用 org.slf4j.spi.LocationAwareLogger 是可以实现的。 - ddekany

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