调试级别日志记录语句性能

时间:2016-08-27 03:58:47

标签: java spring performance logging log4j

如何调整调试日志记录级别语句以获得性能?我问,因为我的春季批处理作业可以调用大约50个这些logger.debug语句(大致相同),每个作业几百万次。

查询:

private final String updateIsUserFl = "update users "
+ "set flag = 'Y' "
+ "where name = ? and id = ? ";

查询执行:

myJdbcTemplate.update(updateIsUserFl, name, id);

记录语句:

String debugQuery = updateIsUserFl.toString();
logger.debug(replace(debugQuery, "?", name, 1));
logger.debug(replace(debugQuery, "?", Integer.toString(id), 1)); 

具体问题:

  1. 所以,基本上,我想打印出传递给我的JdbcTemplate的确切查询。是否有比StringUtils.replace更好/更便宜的方式?希望有点不那么笨重(为了可维护性)。

  2. 在updateUserFl上调用toString是否正确/有效地复制最终字符串对象以进行字符串操作?

  3. 将这个包装在if logger.IsDebugEnabled检查帮助中还是slf4j已经为我做了这个?

  4. 我可以使用logback / {}(以某种方式我无法想到)来提供帮助吗?

  5. log4j2,Java 8(lambdas)是我应该考虑的选项吗?请参阅:Avoid Log4j/Slf4j debug enabled checks

2 个答案:

答案 0 :(得分:2)

这适用于org.springframework.jdbc-3.0.6.RELEASE.jar。 TRACE等级可以做到这一点。

我使用log4j-1.2.15以及slf4j(1.6.4)和属性文件来配置log4j:

log4j.logger.org.springframework.jdbc.core = TRACE

这将显示SQL语句和绑定参数,如下所示:

Executing prepared SQL statement [select HEADLINE_TEXT, NEWS_DATE_TIME from MY_TABLE where PRODUCT_KEY = ? and NEWS_DATE_TIME between ? and ? order by NEWS_DATE_TIME]
Setting SQL statement parameter value: column index 1, parameter value [aaa], value class [java.lang.String], SQL type unknown
Setting SQL statement parameter value: column index 2, parameter value [Thu Oct 11 08:00:00 CEST 2012], value class [java.util.Date], SQL type unknown
Setting SQL statement parameter value: column index 3, parameter value [Thu Oct 11 08:00:10 CEST 2012], value class [java.util.Date], SQL type unknown

SQL类型我们可以在这里忽略它

仅针对SQL(即如果您对绑定参数值不感兴趣)DEBUG就足够了。

答案 1 :(得分:0)

首先,您可以利用现有的Spring日志记录机制将查询和参数视为@Mr。 Noob指出。

如果您想优化自己的日志记录,需要考虑以下几点:

  1. 调用updateIsUserFl.toString()是多余的。 updateIsUserFl已经是String,其中包含您的查询。当您在replace()上调用String时,它会返回一个新的String,而不是更改现有的Stringreplace()在Java中是不可变的。)
  2. 在构建日志消息之前检查日志记录级别。如果消息最终不会进入日志,则无需执行所有这些操作。只有在您已经花费资源构建日志消息之后,Log4j才会执行相同的检查。
  3. if (logger.isDebugEnabled()) { logger.debug(String.format("%s; name=%s, id=%d", updateIsUserFl, name, id)); } 在这里不是一个好选择(它使用正则表达式)。最好将参数值添加到SQL语句的末尾。它足以进行分析。
  4. 所以,最后,你可以这样做:

    \n

    是的,Java 8和Log4j2是一个值得考虑的选择。它将允许您使用延迟执行的lambda而不是级别检查。它通常也更快,耗费更少的内存。

相关问题