通過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 < 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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1388811/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 透過java程式抽取日誌中的sql語句JavaSQL
- 通過日誌檢視mysql正在執行的SQL語句MySql
- Laravel 中輸出 SQL 語句的到 log 日誌LaravelSQL
- 通過java來格式化sql語句JavaSQL
- 通過sql語句分析足彩SQL
- 通過SQL語句提取儲存過程中的內容SQL儲存過程
- SQL語句收縮日誌檔案SQL
- 通過分析SQL語句的執行計劃優化SQL語句SQL優化
- 通過Linux命令過濾出binlog中完整的SQL語句LinuxSQL
- Java中如何解析SQL語句、格式化SQL語句、生成SQL語句?JavaSQL
- oracle 通過sql profile為sql語句加hintOracleSQL
- 通過SQL PROFILE自動優化SQL語句SQL優化
- ORACLE 通過SPM為SQL語句加HINTOracleSQL
- 通過使用hint unnest調優sql語句SQL
- MySQL日誌(一條sql更新語句是如何執行的)MySql
- 通過 alter system dump logfile語句dump REDO及歸檔日誌資訊示例
- 通過分析SQL語句的執行計劃優化SQL 二SQL優化
- 通過ORA錯誤反思sql語句規範SQL
- 通過sql語句分析足彩(第三篇)SQL
- 通過圖表簡化sql語句的表關聯SQL
- sql語句建立日曆SQL
- 透過java來格式化sql語句JavaSQL
- 通過分析SQL語句的執行計劃優化SQL(總結)SQL優化
- sql 中的with 語句使用SQL
- 如何通過trn日誌檔案恢復SQL ServerSQLServer
- MySQL_通過binlog檢視原始SQL語句MySql
- 用 Phoenix 通過 SQL 語句更新操作 HBase 資料SQL
- 用sql語句dbcc log 檢視SQL Server 資料庫的事務日誌SQLServer資料庫
- logminer抽取日誌案例
- 【轉】通過sql語句獲取資料庫的基本資訊SQL資料庫
- 【AWR】通過AWR報告中記錄的 SQL Id獲得SQL語句的執行計劃SQL
- 02 | 日誌系統:一條SQL更新語句是如何執行的?SQL
- 日誌挖掘-對於DDL語句的挖掘
- SQL語句的處理過程SQL
- MySQL在ROW模式下通過binlog提取SQL語句MySql模式
- [20121101]tkprof抽取sql語句.txtSQL
- 程式中的日誌
- 通過 Systemd Journal 收集日誌