改进 log4j 中的细节打印
Improving detail printing in log4j
我有以下代码。
日志级别为INFO。
我们如何编写更好的代码,使 toString 不会被执行?
Set<Integer> resultUserIdsSet = new HashSet<>();
log.trace("userIdsSet={}", resultUserIdsSet.toString());
注意:resultUserIdsSet 包含数百万个整数。
我们使用 ch.qos.logback:logback-classic:jar:1.2.3
供应商延迟加载:
Set<Integer> resultUserIdsSet = new HashSet<>();
log.trace(() -> "userIdsSet=" + resultUserIdsSet);
什么是"log"?现在所有实现都允许像其他答案中提到的那样传递供应商。
在 SLF4J 中有一个 Fixed RFE,但请具体说明您正在谈论的库是什么,版本是什么,等等。
对于旧版本,仍然可以使用这样的旧结构:
if(log.isTraceEnabled()) {
log.trace("userIdsSet={}", resultUserIdsSet.toString());
}
现在不管Supplier
的支持能不能真正解决问题,请大家注意注意:
Note: The resultUserIdsSet contains milions of integers.
这很有问题:
如果您放置这样的日志记录语句,您确实希望它在跟踪级别打印。当跟踪被禁用时(几乎总是读取) - 然后你可以避免像答案中提到的那样进行昂贵的 "toString" 计算。但是,然后我们启用跟踪,它将在集合中创建一百万个整数,可能会发生许多 "interesting" 事情:
- 数以百万计的整数由 appender 打印非常昂贵,无论是控制台还是文件,它的数据确实太多了,I/O 操作很昂贵。
- 即使您确实打印了数百万个整数,也很难从该日志中理解某些内容。
- 如果你在某种外部 for 循环中打印它,事情会变得更糟
底线,请三思,是否真的要打印所有这些 id。也许截断输出是有意义的+提供一些通用的统计数据,比如集合中的 id 数量等等
每个人都在告诉您使用供应商,但没有必要。让记录器执行 toString 调用:
log.trace("userIdsSet={}", resultUserIdsSet);
通过删除 .toString()
,您只是传递了对集合的引用。如果未启用跟踪级别,记录器会立即调用 returns;成本基本上可以忽略不计。
当且仅当启用跟踪级别时,记录器将在集合上调用 toString()
。
我有以下代码。 日志级别为INFO。 我们如何编写更好的代码,使 toString 不会被执行?
Set<Integer> resultUserIdsSet = new HashSet<>();
log.trace("userIdsSet={}", resultUserIdsSet.toString());
注意:resultUserIdsSet 包含数百万个整数。
我们使用 ch.qos.logback:logback-classic:jar:1.2.3
供应商延迟加载:
Set<Integer> resultUserIdsSet = new HashSet<>();
log.trace(() -> "userIdsSet=" + resultUserIdsSet);
什么是"log"?现在所有实现都允许像其他答案中提到的那样传递供应商。 在 SLF4J 中有一个 Fixed RFE,但请具体说明您正在谈论的库是什么,版本是什么,等等。
对于旧版本,仍然可以使用这样的旧结构:
if(log.isTraceEnabled()) {
log.trace("userIdsSet={}", resultUserIdsSet.toString());
}
现在不管Supplier
的支持能不能真正解决问题,请大家注意注意:
Note: The resultUserIdsSet contains milions of integers.
这很有问题: 如果您放置这样的日志记录语句,您确实希望它在跟踪级别打印。当跟踪被禁用时(几乎总是读取) - 然后你可以避免像答案中提到的那样进行昂贵的 "toString" 计算。但是,然后我们启用跟踪,它将在集合中创建一百万个整数,可能会发生许多 "interesting" 事情:
- 数以百万计的整数由 appender 打印非常昂贵,无论是控制台还是文件,它的数据确实太多了,I/O 操作很昂贵。
- 即使您确实打印了数百万个整数,也很难从该日志中理解某些内容。
- 如果你在某种外部 for 循环中打印它,事情会变得更糟
底线,请三思,是否真的要打印所有这些 id。也许截断输出是有意义的+提供一些通用的统计数据,比如集合中的 id 数量等等
每个人都在告诉您使用供应商,但没有必要。让记录器执行 toString 调用:
log.trace("userIdsSet={}", resultUserIdsSet);
通过删除 .toString()
,您只是传递了对集合的引用。如果未启用跟踪级别,记录器会立即调用 returns;成本基本上可以忽略不计。
当且仅当启用跟踪级别时,记录器将在集合上调用 toString()
。