繁体   English   中英

调试级别记录语句性能

[英]Debug Level Logging Statement Performance

如何调整调试日志记录级别语句的性能? 我之所以这样问,是因为我的春季批处理工作可以为每个工作调用大约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)吗? 请参阅: 避免启用Log4j / Slf4j调试

这将与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就足够了。

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

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

  1. 调用updateIsUserFl.toString()是多余的。 updateIsUserFl已经是包含您的查询的String 当您在String上调用replace()时,它将返回一个新的String而不是更改现有的String (Java中String是不可变的)。
  2. 在构造日志消息之前,请检查日志记录级别。 如果消息最终不会进入日志,则无需执行所有这些操作。 Log4j会执行相同的检查,但前提是您已经花了很多资源来构建日志消息。
  3. replace()不是一个好的选择(它使用正则表达式)。 最好将参数值添加到SQL语句的末尾。 分析就足够了。

因此,最后,您可以这样做:

if (logger.isDebugEnabled()) {
    logger.debug(String.format("%s; name=%s, id=%d", updateIsUserFl, name, id));
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM