P6Spy的去掉ResultSet以及加入每日归档
P6Spy是一个很好的在ssh下进行数据库日志操作的工具,可以记录用户的查询操作,缺点:(1)对与每一个查询的结果集都会记录下来,这样当数据库表中数据量大的时候,日志的膨胀速度无法估计,经常是上GB级的log文件,无法打开,成了死的文件。(2)不支持每天生成一份日志记录,这样不便于只查看某天的数据库操作日志,当累积天数过多时也会造成日志文件的过于庞大,无法查看。
下面进行改造:
一、去掉结果集
这一步主要是包括修改com.p6spy.engine.logging.P6LogResultSet,修改其中的next方法如下:
public boolean next() throws SQLException {
long startTime = System.currentTimeMillis();
try {
return super.next();
} finally {
P6Connection p6connection = (P6Connection) this.statement.getConnection();
P6LogQuery.logElapsed(p6connection.getId(), startTime, "result",preparedQuery, query);
}
}
这样就可以在spy.properties中添加resultset来过滤掉结果集了:
excludecategories=info,debug,result,batch,resultset
为了去掉绑定的sql,减小sql语句的长度,修改com.p6spy.engine.logging.appender.FormattedLogger的logSQL方法如下:
public void logSQL(int connectionId, String now, long elapsed, String category, String prepared, String sql) {
String logEntry = now + "|" + elapsed + "|"
+ (connectionId == -1 ? "" : String.valueOf(connectionId))
+ "|" + category + "|" + sql;
logText(logEntry);
}
二、每天产生一个文件
这一步主要是在p6spy写入日志的时候截获当前时间,在当前日期文件下进行写入操作。
1)首先在com.p6spy.engine.common.P6SpyOptions加入你自己的日期格式(效仿log4j):
private static String rollingDatePattern;
生成setter和getter方法,如下:
public static String getRollingDatePattern() {
return rollingDatePattern;
}
public static void setRollingDatePattern(String rollingDatePattern) {
if (rollingDatePattern == null)
rollingDatePattern = "'.'yyyy-MM-dd";
P6SpyOptions.rollingDatePattern = rollingDatePattern;
}
2)在com.p6spy.engine.common.P6LogQuery中截获日志写入的方法doLog,加入以下内容:
if (logger instanceof FileLogger) {// file logger
String logfile = P6SpyOptions.getLogfile();
String suffix = "";
String dataFormatingSrtyle = P6SpyOptions.getRollingDatePattern();
if (dataFormatingSrtyle != null) {
dataFormatingSrtyle = dataFormatingSrtyle.substring("'.'".length());
SimpleDateFormat sdf = new SimpleDateFormat( dataFormatingSrtyle);
Date now = new Date();
suffix = "." + sdf.format(now);
}
logfile = (logfile == null) ? "spy.log" + suffix : logfile+ suffix;// logfile
// name
((FileLogger) logger).setLogfile(logfile);// set log file
3)在spy.properties中加入产生每日归档的属性即可:
#gen a databse log file every day
rollingDatePattern='.'yyyy-MM-dd
有一些包需要自己找,就是调用ant进行p6spy的源代码重构,改造成自己的p6spy.jar,需要在2003年9月左右的jar包噻,找不到的话就使劲找,不然就删一些无关紧要的文件夹,比如jboss,test之类的,不影响。