我在应用程序中使用Log4J进行日志(log)记录.之前我使用的调试调用如下:

Option 1:

logger.debug("some debug text");

但一些链接建议最好先判断isDebugEnabled(),比如:

Option 2:

boolean debugEnabled = logger.isDebugEnabled();
if (debugEnabled) {
    logger.debug("some debug text");
}

所以我的问题是"Does option 2 improve performance any way?".

因为在任何情况下,Log4J框架对debugEnabled都有相同的判断.对于选项2,如果我们在单个方法或类中使用多个调试语句,框架不需要多次调用isDebugEnabled()个方法(每次调用);在这种情况下,它只调用isDebugEnabled()方法一次,如果Log4J被配置为调试级别,那么实际上它调用isDebugEnabled()方法两次:

  1. 如果为debugEnabled变量赋值,以及
  2. 实际上是由记录器调用的.debug()方法.

我不认为如果我们在方法或类中编写多个logger.debug()语句,并根据选项1调用debug()方法,那么与选项2相比,Log4J框架的开销会很大.因为isDebugEnabled()是一个非常小的方法(就代码而言),所以它可能是内联的很好的候选者.

推荐答案

在这种情况下,选项1更好.

当涉及调用各种对象的toString()个方法并连接结果时,存在Guard语句(判断isDebugEnabled())以防止潜在昂贵的日志(log)消息计算.

在给定的示例中,日志(log)消息是一个常量字符串,因此让记录器丢弃它与判断记录器是否已启用一样有效,并且由于分支较少,因此它降低了代码的复杂性.

Better yet is to use a more up-to-date logging framework where the log statements take a format specification and a list of arguments to be substituted by the logger—but "lazily," only if the logger is enabled. This is the approach taken by slf4j.

有关更多信息,请参见my answer to a related question,以及使用log4j执行类似操作的示例.

Java相关问答推荐

如何在Spring Boot中创建500错误的响应正文?

使用log 4j2格式的Hibernate 显示SQL日志(log)

将linkedHashMap扩展到Java中的POJO类

当切换javaFX场景时,stage的大小正在Minimize

参数值[...]与预期类型java.util.Date不匹配

Spring Batch 5-不要让它在数据库中自动创建表

是否保证在事务性块的末尾标记违反约束?

为什么不应用类型推断?

在学习Spring时,通过构造函数参数0表达了不满意的依赖关系

在Java 15应用程序中运行Java脚本和Python代码

使IntelliJ在导入时优先 Select 一个类或将另一个标记为错误

视图被推出线性布局-Android

将java.util.Date(01.01.0001)转换为java.time.LocalDate将返回29.12.0000

如何对存储为字符串的大数字数组进行排序?

JPA无手术同品种器械可能吗?

Java 17与Java 8双重表示法

无法在Java中获取ElastiCache的AWS CloudWatch指标

我无法在我的Spring Boot应用程序中导入CSV依赖项

在WHILE()循环初始化部分中声明和初始化变量的Java语法?

使用同步方法中的新线程调用同步方法