java - log4j v2 格式化功能

标签 java string memory logging log4j2

在记录器的情况下,它说对于每个记录器都有参数构造的隐藏成本。

例如:-

 logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));

这会产生构建消息参数的成本,即将整数 i 和 entry[i] 都转换为字符串,并连接中间字符串,而不管消息是否会被记录。这种参数构造的成本可能相当高,并且取决于所涉及的参数的大小。

在 log 4j 站点上给出了避免参数构造成本的最佳方法是使用 Log4j 2 的格式化功能。例如,代替上面的写法:

logger.debug("Entry number: {} is {}", i, entry[i]);

此格式化功能内部发生的情况使这次花费的成本会更少。它不是像以前的案例那样创建字符串吗?请有人解释一下?

最佳答案

在第一个示例中,即使不需要也创建字符串。但是,如果需要,这可能是最有效的方法。顺便说一句,String.valueOf 是多余的。

如果关闭消息,第二个选项会更快。这避免了创建一个后来被丢弃的字符串,因为它可以在构建字符串之前检查是否启用了调试。注意:如果您确实需要 String,它可能会更慢,因为它必须解析消息格式。

两全其美,但最难的是

if(logger.isDebugEnabled())
    logger.debug("Entry number: " + i + " is " + entry[i]);

在这种情况下,您进行检查,如果要记录,则获取最快的消息生成。


有一些日志记录框架可以避免创建任何字符串并且速度足够快,您不需要首先关闭调试,但这些框架使用起来并不简单,除非您需要更高的性能,否则我会避免使用它们。

关于java - log4j v2 格式化功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20639634/

相关文章:

java - 对象构造在实践中是否保证所有线程都看到已初始化的非最终字段?

c - 删除尾随的 NULL 终止符

c - 如何在不调用外部程序的情况下测量进程的内存使用情况

java - Android Studio 中名称值对中的内容如何作为参数传递?

java - 尝试从父实体java类中删除记录

java - 需要在 GC 之前关闭存储为 SoftReference 的PreparedStatements

python - 如何将字符串与多个正则表达式匹配?

c# - 如果它们太长,我如何用 "..."截断我的字符串?

memory - 'maximum resident set size' 是否等于 'required RAM size for the process at least' ?

c# - 为什么我超出了内存限制? C#