【问题标题】:log4j v2 formatting capabilitieslog4j v2 格式化功能
【发布时间】:2013-12-17 16:33:49
【问题描述】:

如果是记录器,它表示每个记录器都有参数构造的隐藏成本。

例如:-

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

在这种格式化功能中发生的事情,这次产生的成本会更少。它不是像以前那样创建字符串吗?请有人解释一下?

【问题讨论】:

    标签: java string memory logging log4j2


    【解决方案1】:

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

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

    两全其美,但最重要的是

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

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


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

    【讨论】:

    • 好吧,我的第一个查询是关于第二个选项中使用的更改方法,我们在 logger.debug 中传递 3 个参数,该方法将如何处理这些参数。 log4j v2 格式化功能的新功能其次,您的意思是说在第二种情况下,在创建参数之前,logger 会检查是否启用了调试模式。
    猜你喜欢
    • 2015-09-07
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多