通过java程序抽取日志中的sql语句(r4笔记第4天)

今天在翻看以前的笔记时,发现自己在很早之前写过一个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 < filesOfDirs.length; 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

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2015-01-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏文渊之博

T-SQL—理解CTEs

在推出SQLServer2005之后,微软定义了一个新的查询架构叫做公共表表达式--CTE。CTE是一个基于简单查询的临时结果集,在一个简单的插入、更新、删除或...

23790
来自专栏小筱月

SSM框架的sql中参数注入(#和$的区别)

ORDER BY ${order} 和模糊查询 username LIKE '%${username}%' 是用$符号,其他的大多是用 #{} 来获取传递的参数...

21920
来自专栏java系列博客

Oracle使用对象类型3(MEMBER方法的对象类型)

24240
来自专栏Hongten

java开发_mysql中获取数据库表描述_源码下载

我们需要获取表:test_table表的描述信息,然后把描述信息插入到表:data_element_config中记录结果

37120
来自专栏北京马哥教育

Mysql 架构和索引

字段类型选择 慷慨是不明智的 在相关的表中使用相同的数据类型,因为可能进行join 选择标示符:整数通常是最佳选择,尽量避免使用字符串 大致决定数据类型(数字,...

36690
来自专栏编程心路

SSH框架之旅-hibernate(3)

表 A 中的一条记录只能和表 B 的一条记录,反之亦然。这种关系的表并不常见,因为既然可以存放在两张表中的数据,也可以用一张表来存放。一对一的表关系用于: 1...

10920
来自专栏Python爬虫实战

MySQL 从零开始:09 计算字段

在数据库中存储公司信息,一般用两个表列分别表示公司名和公司地址。 如果想要在一个字段中既显示公司名,又要显示公司地址,那么就需要对已有字段进行处理了,这个处理过...

9720
来自专栏乐沙弥的世界

SQL 基础-->常用函数

lpad | rpad(x,width [,pad_string]) 字符定长,(不够长度时,左|右填充)

12120
来自专栏深度学习之tensorflow实战篇

sql之left join、right join、inner join的区别

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等...

37180
来自专栏JMCui

SQL优化一(SQL使用技巧)

1、行列转换:   decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值);   select decode(sign(变量1-变量...

53030

扫码关注云+社区

领取腾讯云代金券