通过java程序抽取日志中的sql语句(r4笔记第4天)
时间:2022-05-04
本文章向大家介绍通过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
- EnterLib PIAB又一个BUG?[续]——这是一个致命的BUG
- Google工程师:谷歌翻译在几个月内效果明显提升的秘诀
- 回调与并发: 通过实例剖析WCF基于ConcurrencyMode.Reentrant模式下的并发控制机制
- EnterLib PIAB又一个BUG?[续]——这是一个致命的BUG
- 年终盘点2017年发生在上海的科技大新闻
- 数字供应链第六章-网络风险、知识产权盗窃、合规和数据挖掘业务合同
- 使命必达: 深入剖析WCF的可靠会话[实例篇](内含美女图片,定力差者慎入)
- 快速全面构建大数据认知体系
- 谈谈分布式事务之二:基于DTC的分布式事务管理模型[上篇]
- ConcurrencyMode.Multiple 模式下的WCF服务就一定是并发执行的吗:探讨同步上下文对并发的影响[下篇]
- 谈谈分布式事务之二:基于DTC的分布式事务管理模型[上篇]
- 学习SpringMVC——拦截器
- 学习SpringMVC——国际化+上传+下载
- 行业研究:大数据(一)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 线程和线程池的几个状态值
- 阿里代码规约为什么不让使用Executors包装好线程池呢?
- Groovy、热部署和热加载(自定义类加载器)及spring loaded 部分源码分析
- Centos在线迁移到腾讯云cvm
- ClickHouse源码导读:网络IO
- 手把手教你:将ClickHouse集群迁至云上
- 直播中台iLiveSDK终端框架演变之路
- ClickHouse 数据导入实战:Kafka 篇
- pipeAsyncFunctions
- 【python-leetcode287-循环排序】寻找重复的数
- 聊聊claudb的list command
- 【python-leetcode448-循环排序】找到所有数组中消失的数字
- input/change/composition/keydown事件详解
- isSameDate
- 【python-leetcode57-区间合并】插入区间