最近运维的兄弟一直报怨日志量陡增,测试反应我们的sql语句打印了两遍,我们的负责人说是p6spy的自有的机制,若更改需要研究下,于是问题就到了我这里。
首先关注点为什么打印两次?实际上第一次是parpared sql,也就是预编译语句,第二次就是实际执行的语句了。
那么既然两次,我们应该可以配置只打印一次,后来发现并可行。我们可以定制:只输出带参数的sql语句。
首先我们必须知道p6spy存在两种日志模式logging model
1.MultiLineFormat 多行
2.SingleLineFormat 单行
以上两种方式的源码对于我们定制日志有很大启发:
以下是我采用单行sql输出的方式
package com.zone.common.p6spylog;
import com.p6spy.engine.common.P6Util;
import com.p6spy.engine.spy.appender.MessageFormattingStrategy;
/**
* 解决输出两次sql的问题
*/
public class CustomSqlFormat implements MessageFormattingStrategy {
@Override
public String formatMessage(final int connectionId, final String now, final long elapsed, final String category,
final String prepared, final String sql) {
return now + "|" + elapsed + "|" + category + "|connection " + connectionId //+ "|" + P6Util.singleLine(prepared)
+ "|" + P6Util.singleLine(sql);
}
}
然后配置修改spy.properties配置logMessageFormat为以上重新实现类
#class to use for formatting log messages (default is: com.p6spy.engine.spy.appender.SingleLineFormat)
#logMessageFormat=com.p6spy.engine.spy.appender.SingleLineFormat
logMessageFormat=com.zone.common.p6spylog.CustomSqlFormat
测试通过。