package io.mycat.server.interceptor.impl; import io.mycat.MycatServer; import io.mycat.net.NetSystem; import io.mycat.server.config.node.SystemConfig; import io.mycat.server.interceptor.SQLInterceptor; import io.mycat.server.parser.ServerParse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.HashMap; import java.util.Map; public class StatisticsSqlInterceptor implements SQLInterceptor { private final class StatisticsSqlRunner implements Runnable { private int sqltype = 0; private String sqls = ""; public StatisticsSqlRunner(int sqltype, String sqls) { this.sqltype = sqltype; this.sqls = sqls; } public void run() { try { SystemConfig sysconfig = MycatServer.getInstance().getConfig() .getSystem(); String sqlInterceptorType = sysconfig.getSqlInterceptorType(); String sqlInterceptorFile = sysconfig.getSqlInterceptorFile(); String[] sqlInterceptorTypes = sqlInterceptorType.split(","); for (String type : sqlInterceptorTypes) { if (StatisticsSqlInterceptor.parseType(type.toUpperCase()) == sqltype) { switch (sqltype) { case ServerParse.SELECT: StatisticsSqlInterceptor.appendFile( sqlInterceptorFile, "SELECT:" + sqls + ""); break; case ServerParse.UPDATE: StatisticsSqlInterceptor.appendFile( sqlInterceptorFile, "UPDATE:" + sqls); break; case ServerParse.INSERT: StatisticsSqlInterceptor.appendFile( sqlInterceptorFile, "INSERT:" + sqls); break; case ServerParse.DELETE: StatisticsSqlInterceptor.appendFile( sqlInterceptorFile, "DELETE:" + sqls); break; default: break; } } } } catch (Exception e) { LOGGER.error("interceptSQL error:" + e.getMessage()); } } } private static final Logger LOGGER = LoggerFactory .getLogger(StatisticsSqlInterceptor.class); private static Map<String, Integer> typeMap = new HashMap<String, Integer>(); static { typeMap.put("SELECT", 7); typeMap.put("UPDATE", 11); typeMap.put("INSERT", 4); typeMap.put("DELETE", 3); } public static int parseType(String type) { return typeMap.get(type); } /** * 方法追加文件:使用FileWriter */ private static synchronized void appendFile(String fileName, String content) { Calendar calendar = Calendar.getInstance(); DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); String dayFile = dateFormat.format(calendar.getTime()); try { String newFileName = fileName; // 打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件 String[] title = newFileName.split("\\."); if (title.length == 2) { newFileName = title[0] + dayFile + "." + title[1]; } File file = new File(newFileName); if (!file.exists()) { file.createNewFile(); } FileWriter writer = new FileWriter(file, true); String newContent = content.replaceAll("[\\t\\n\\r]", "") + System.getProperty("line.separator"); writer.write(newContent); writer.close(); } catch (IOException e) { LOGGER.error("appendFile error:" + e); } } /** * interceptSQL , type :insert,delete,update,select exectime:xxx ms log * content : select:select 1 from table,exectime:100ms,shared:1 etc */ @Override public String interceptSQL(String sql, int sqlType) { LOGGER.debug("sql interceptSQL:"); final int sqltype = sqlType; final String sqls = DefaultSqlInterceptor.processEscape(sql); NetSystem.getInstance().getExecutor() .execute(new StatisticsSqlRunner(sqltype, sqls)); return sql; } }