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

java提取日志sql,通过Java程序抽取日志中的sql语句相关推荐

  1. jboss7 关闭日志打印_使用自定义日志记录处理程序在JBoss AS 7中跟踪SQL语句

    jboss7 关闭日志打印 使用ORM从您的特定数据库中提取数据并让其创建和发布您必须亲自编写的所有SQL语句似乎很方便. 这就是使ORM解决方案受欢迎的原因. 但是它也有一个缺点:由于ORM为您做了 ...

  2. 使用自定义日志记录处理程序在JBoss AS 7中跟踪SQL语句

    使用ORM从您的特定数据库中提取数据,并让它创建和发布您必须亲自编写的所有SQL语句似乎很方便. 这就是使ORM解决方案受欢迎的原因. 但是它也有一个缺点:由于ORM为您做了很多工作,因此您在某种程度 ...

  3. sas sql中有类似mysql的 g_SAS中的SQL

    自我愚见,望有错指出改之. /*SQL 学习*/ /*数据定义语言(DDL):create.drop.alter*/ /*数据操作语言(DML):insert.update.delete*/ /*数据 ...

  4. php中防sql注入,如何在PHP应用中防止SQL注入

    SQL注入是一个控制数据库查询的技术,往往会导致丧失机密性.在某些情况下,如果成功执行SELECT 'phpeval(base64_decode("someBase64EncodedData ...

  5. python解析sql文件_如何从Python中解析sql文件?

    是否有任何方法可以从Python中执行.SQL文件中的某些SQL命令,而不是文件中的所有SQL命令?假设我有以下.sql文件:DROP TABLE IF EXISTS `tableA`; CREATE ...

  6. sql azure 语法_在Azure中使用SQL Server 2016 CTP3

    sql azure 语法 As the time of the release of the next version of SQL Server is closing in, the cycle o ...

  7. sql 会话_在特定会话中禁用SQL Server中的触发器

    sql 会话 This article will focus on the various ways to disable triggers in SQL Server so they won't i ...

  8. java 实现syslog 服务器_应用程序的日志通过rsyslog推送到syslog服务器

    centos5系列系统自带为syslog1.4.1 centos6系列自带rsyslog版本为5.8.10 centos7系列自带rsyslog版本为7.4.7 目前最新版rsyslog为8.27.0 ...

  9. java web指纹采集_web应用程序指识别中的指纹收集

    web应用程序指纹识别是入侵前的关键步骤,假设通过指纹识别能确定web应用程序的名称及版本号.下一步就可以在网上搜索已公开的漏洞.或网上搜到其源码然后进行白盒的漏洞挖掘. 指纹识别的核心原理是通过正則 ...

  10. java filter注入_如何使用Filter过滤请求中的SQL注入攻击

    在doFilter方法中编写判断逻辑 public void doFilter(ServletRequest request, ServletResponse response, FilterChai ...

最新文章

  1. BZOJ3473:字符串(后缀数组,主席树,二分,ST表)
  2. Failed to start bean ‘documentationPluginsBootstrapper‘ StackOverflowError
  3. hibernate自动配置_Hibernate自动冲洗的黑暗面
  4. 链表题目--2 求链表的中间结点 和 求链表中倒数第k个结点
  5. Docker安装禅道项目管理平台zendao-v11.6.x
  6. 知乎:全球发售2600万股销售股份 每股发售价51.8港元
  7. Day9 深度学习入门
  8. convolutional pose machines
  9. java 参数校验 优雅的,SpringBoot 如何优雅的进行参数校验
  10. JS判断用户手机是IOS还是Android
  11. CSS入门学习笔记+案例
  12. 柳传志:对杨元庆“有信心
  13. 苹果手机如何分享wifi密码_WiFi密码破解器 v5.1.3手机版
  14. 查询个人电脑当前公网IP地址
  15. 边境的悍匪—机器学习实战:第十八章 强化学习
  16. JavaScript,for循环效率测试,不同遍历循环测试,数组添加效率测试,大数组拼接测试,for循环遍历修改 和 string replace效率
  17. 【Linux】 常用命令
  18. IT“茫一代”:35岁成生死线 无处安放未来
  19. C语言及程序设计初步例程-4 C语言程序初体验
  20. 交易员的不同心理状态以及如何达到最高的交易心境

热门文章

  1. 一键安装Tengine服务器,TengineRPM(LTMP)构建高效、稳定、安全、易用的Web平台
  2. ognl表达式的小知识点
  3. HTML5 3D翻书效果(双面效应)
  4. Oracle EBS-SQL (PO-10):检查过期采购未接收订单.sql
  5. UVA 1449 - Dominating Patterns AC自动机
  6. php+mysql数据库语法错误_求教:PHP+MYSQL制作用户登录系统问题,总是提示数据库查询语句语法不对。$sql=mysql_query(。。。)这行...
  7. ScrollRect裁剪ParticleSystem粒子
  8. 如何从一个html页面调用另外一个页面的js函数,解决同一页面中两个iframe互相调用jquery,js函数的方法...
  9. java welcome-file_通过JSF项目中的welcome-file设置默认主页
  10. C# 从MongoDB导入数据到mysql