通过java程序抽取日志中的sql语句

今天在翻看以前的笔记时,发现自己在很早之前写过一个java程序,能够解析日志中的sql语句。
当时使用的环境是weblogic,日志目录下总是有几十上百个日志文件,有时候排查问题的时候只需要找到对应的DML语句即可。
使用linux命令固然也可以,但是解析的时候还是比较被动,不能够正确地解析出sql语句来。比如日志中出现insert的字样可能只是日志中的一段信息,不是insert语句。
这些通过linux命令来完成还是有一定的难度,记得当时问题比较多,自己也饱受这种困扰。于是写了一个java程序来。
代码如下:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class LogToSqlMain {
 private static String SELECT = "SELECT";
 private static String UPDATE = "UPDATE";
 private static String DELETE = "DELETE";
 private static String INSERT = "INSERT";
 private static String ALL = "ALL";

 public static void main(String[] args) {
  new LogToSqlMain().parse(args);
 }

 public void test(File logFile) {
  // get file
  // initialized io
  // parse log to sql

  // format sql
  // generate sql file
  // invoke jdbc
 }

 public void parse(String[] args) {
  String args0 = null;
  String args1 = null;
  if (args == null) {
   return;
  }
  if (args != null && args.length == 1) {
   args0 = args[0];
  }
  if (args != null && args.length == 2) {
   args0 = args[0];
   args1 = args[1];
   if (!args1.equalsIgnoreCase(ALL) && !args1.equalsIgnoreCase(SELECT)
     && !args1.equalsIgnoreCase(UPDATE) && !args1.equalsIgnoreCase(DELETE)
     && !args1.equalsIgnoreCase(INSERT)) {
    return;
   }
  }

  BufferedReader buffer_reader = null;
  String sql_type = null;
  try {
   File file = new File(args0);
   File[] filesOfDirs = file.listFiles();
   if (!file.isDirectory() || filesOfDirs.length == 0) {
    System.out.println("invalid path or io error");
    return;
   }
   String temp_read = null;
   String strTemp = null;
   String strTimeStamp = null;
   Long log_Line_Num = null;
   for (int i = 0; i
    if (getSqlMode(args1, filesOfDirs[i].getName())) {
     File tmp_File = filesOfDirs[i].getAbsoluteFile();
     sql_type = getSQLType(tmp_File);
     buffer_reader = new BufferedReader(new FileReader(tmp_File));
     temp_read = buffer_reader.readLine();
     while (temp_read != null) {
      char sep_str = ':';
      // validate every line should be SQL
      if (validateFileLine(temp_read, sql_type)) {
       log_Line_Num = Long.parseLong(temp_read.substring(
         0, temp_read.indexOf(sep_str)));
       strTemp = temp_read.substring(temp_read
         .indexOf(':') + 1);
       strTimeStamp = strTemp.substring(
         strTemp.indexOf('[') + 1,
         strTemp.indexOf(']'));
       strTemp = strTemp
         .substring(strTemp.indexOf(']') + 1);
       String temp_Sql = strTemp.substring(strTemp
         .indexOf(sql_type + " "));
       System.out.println(sql_type + log_Line_Num + ","
         + strTimeStamp + "," + temp_Sql);
      }
      temp_read = buffer_reader.readLine();
     }
     buffer_reader.close();
    }
   }
  } catch (NumberFormatException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   if (buffer_reader != null) {
    try {
     buffer_reader.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }

 }

 private boolean validateFileLine(String str_Line, String sql_type) {
  if (sql_type.equals(INSERT)) {
   if (str_Line.toUpperCase().contains("INTO")
     && str_Line.toUpperCase().contains("VALUES"))
    return true;
  } else if (sql_type.equals(SELECT)) {
   if (str_Line.toUpperCase().contains("FROM")
     && str_Line.toUpperCase().contains("WHERE")) {
    return true;
   }
  } else if (sql_type.equals(UPDATE)) {
   if (str_Line.toUpperCase().contains("SET")
     && str_Line.toUpperCase().contains("WHERE")) {
    return true;
   }
  } else if (sql_type.equals(DELETE)) {
   if (str_Line.toUpperCase().contains("WHERE")) {
    return true;
   }
  }
  return false;
 }

 private String getSQLType(File file) {
  if (file.getName().toUpperCase().contains(SELECT)) {
   return SELECT;
  } else if (file.getName().toUpperCase().contains(UPDATE)) {
   return UPDATE;
  } else if (file.getName().toUpperCase().contains(DELETE)) {
   return DELETE;
  } else if (file.getName().toUpperCase().contains(INSERT)) {
   return INSERT;
  }
  return null;
 }

 public boolean getSqlMode(String args, String fileName) {
  if (args == null || ALL.equalsIgnoreCase(args))
   return (fileName.startsWith(INSERT) || fileName.startsWith(DELETE)
     || fileName.startsWith(UPDATE) || fileName
      .startsWith(SELECT));
  if ((SELECT).equalsIgnoreCase(args)) {
   return (fileName.startsWith(SELECT));
  } else if ((UPDATE).equalsIgnoreCase(args)) {
   return (fileName.startsWith(UPDATE));
  } else if ((INSERT).equalsIgnoreCase(args)) {
   return (fileName.startsWith(INSERT));
  } else if ((DELETE).equalsIgnoreCase(args)) {
   return (fileName.startsWith(DELETE));
  }
  return false;
 }
}

如果需要得到a.log中的sql语句,
就可以这样调用java程序 java LogToSqlMain a.log INSET
如果想得到所有的sql语句 java LogToSqlMain a.log ALL

时间: 2024-09-11 16:09:17

通过java程序抽取日志中的sql语句的相关文章

在Java的Hibernate框架中使用SQL语句的简单介绍_java

Hibernate中有HQL查询语法.但我们用得比较熟的还是数SQL语句,那么应该怎么来让Hibernate支持SQL呢?这个不用我们去考虑了,Hibernate团队已经早就做好了.        废话不说,直接来例子啦. select * from t_user usr     上面是一条SQL语句,又是废话,是个人都知道.我们想让Hibernate执行这条语句,怎么办呢?看代码: Query query = session.createSQLQuery("select * from t_us

java-为什么我在Java类中执行SQL语句,程序没错,而数据库却没执行??

问题描述 为什么我在Java类中执行SQL语句,程序没错,而数据库却没执行?? 解决方案 不知道画了删除线是什么意思,你确认这些代码有效么 解决方案二: 你用的什么啊?Hibernate?还是别的框架啊?Hibernate的话,可能是事务没有提交,你执行flush方法就可以了 解决方案三: 代码可以贴全一点吗?看不到关键部分 解决方案四: 代码内容太少了,你的Sqlca是个什么,最起码给个声明. 解决方案五: 你的sqlca是什么啊? 解决方案六: executeSQL方法问题 这个方法只能是查

实例讲解ASP动态网页制作中使用SQL语句

sql|动态|网页|语句 在SQL的世界里,最最基础的操作就是SELECT 语句了.在数据库工具下直接采用SQL的时候很多人都. 在ASP中使用SQL语句之1:用Select查询 熟悉下面的操作: SELECT whatFROM whichTableWHERE cnwebjx 执行以上语句就会创建一个存放其结果的查询. 而在ASP页面文件上,你也可以采用以上的一般语法,不过情况稍微不同,ASP编程的时候,SELECT 语句的内容要作为字符串赋给一个变量: SQL = "SELECT what F

MySQL中优化sql语句查询常用的30种方法

本篇文章是对MySQL中优化sql语句查询常用的30种方法进行了详细的分析介绍,需要的朋友参考下   1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以

mysql-java中的sql语句为何会报错,而到了workbench就可以执行

问题描述 java中的sql语句为何会报错,而到了workbench就可以执行 rt基本上是timestamp的格式,比如insert into table values ('2015-03-17 00:00:00');这句话在java通过jdbc执行就会报错,而直接在workbench下面操作就没有问题为什么会这样? 解决方案 可能是字符串单引号等引起的,打印代码中的字符串跟workbench中比较 解决方案二: insert into table(字段1,字段2....) value( 值1

oracle-怎样验证spool中的sql语句是否执行成功

问题描述 怎样验证spool中的sql语句是否执行成功 在linux环境下,执行一个sh脚本,里面包含了spool,里面包含查询语句,将查询结果指定到了一个txt文件,然后我需要知道这个语句是否执行成功.然后再导到另外的日志txt里面去. 求大神解决,或者推荐别的方法. 解决方案 判断SQL语句是否执行成功

C语言中嵌入式SQL语句

原文:[转载]C语言中嵌入式SQL语句 http://blog.csdn.net/cnlht/archive/2007/12/12/1930960.aspx原文地址 实验内容: 掌握SQL Server 2000的预编译程序NSQLPREP.EXE的使用(以课本例题1进行调试): 实验步骤: 一.数据库环境配置 1.创建xuesheng数据库,建立student表等: 2.关闭sql server 2000服务管理器: 3.将devtools文件夹拷贝到:C:\Program Files\Mic

[20150705]从AWR抽取有问题的sql语句.txt

[20150705]从AWR抽取有问题的sql语句.txt --闲着没事,写一个脚本从awr数据里面抽取有问题的sql语句,主要我不想看awr报表,而优化80%的问题集中在sql语句,实际上可能更多. --另外我看报表主要集中在9-11点,下午3-5点这些报表,这样可能漏调一些晚上的一些schedule,job等相关sql语句的优化. --注意一定要在环境变量中设置 --NLS_DATA_FORMAT='YYYY/MM/DD HH24:MI:SS' prompt prompt @deltasql

ACCESS中使用SQL语句应注意的地方及几点技巧

access|技巧|语句 ACCESS中使用SQL语句应注意的地方及几点技巧引用:Fred 以下SQL语句在ACCESS XP的查询中测试通过 建表:    Create Table Tab1 (        ID Counter,        Name string,        Age integer,        [Date] DateTime); 技巧:    自增字段用 Counter 声明.    字段名为关键字的字段用方括号[]括起来,数字作为字段名也可行. 建立索引: