如何调整调试日志记录级别语句以获得性能?我问,因为我的春季批处理作业可以调用大约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));
具体问题:
所以,基本上,我想打印出传递给我的JdbcTemplate的确切查询。是否有比StringUtils.replace更好/更便宜的方式?希望有点不那么笨重(为了可维护性)。
在updateUserFl上调用toString是否正确/有效地复制最终字符串对象以进行字符串操作?
将这个包装在if logger.IsDebugEnabled检查帮助中还是slf4j已经为我做了这个?
我可以使用logback / {}(以某种方式我无法想到)来提供帮助吗?
log4j2,Java 8(lambdas)是我应该考虑的选项吗?请参阅:Avoid Log4j/Slf4j debug enabled checks
答案 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指出。
如果您想优化自己的日志记录,需要考虑以下几点:
updateIsUserFl.toString()
是多余的。 updateIsUserFl
已经是String
,其中包含您的查询。当您在replace()
上调用String
时,它会返回一个新的String
,而不是更改现有的String
(replace()
在Java中是不可变的。)if (logger.isDebugEnabled()) {
logger.debug(String.format("%s; name=%s, id=%d", updateIsUserFl, name, id));
}
在这里不是一个好选择(它使用正则表达式)。最好将参数值添加到SQL语句的末尾。它足以进行分析。所以,最后,你可以这样做:
\n
是的,Java 8和Log4j2是一个值得考虑的选择。它将允许您使用延迟执行的lambda而不是级别检查。它通常也更快,耗费更少的内存。