P6Spy的去掉ResultSet以及加入每日归档

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之类的,不影响。

你可能感兴趣的:(sql,log4j,ant,jboss,ssh)