从 tomcat 日志中提取 sql 查询
Extracting sql queries from tomcat logs
我需要通过遵循面向对象的设计模式来开发 JAVA 应用程序,以便从 Tomcat 日志中提取 sql 查询。我有日志文件。我需要从该文件中提取 sql 查询。
我是这个领域的新手。我需要了解哪些基础知识才能做到这一点或提供一些好的参考资料。
由于我无法共享整个日志文件,所以我只共享其中的一部分:
(Dao.java:执行:73) SELECT ORDER_STATUS_TYPE_ID, 来自 ORD.ORDER_STATUS_TYPE 的名称
[调试] [RMI TCP 连接 (5)-127.0.0.1 2018 年 2 月 5 日 15:00:10] (TraceInterceptor.java:writeToLog:26) []离开 TypeDaoImpl.getOrderStatusType(): 1062ms: [com.xyz.abc.api.is.model.type.OrderStatusType@2ac9ecc3,com.xyz.abc.api.is.model.type.OrderStatusType@76777395,com.xyz.abc.api.is.model.type.OrderStatusType@6ad8ddb7,com.xyz.abc.api.is.model.type.OrderStatusType@6738868f,com.xyz.abc.api.is.model.type.OrderStatusType@272c15f,
您的问题表明您已经有一个包含 SQL 的日志文件。虽然有更好更快的方法来使用不同的操作系统工具解析此文件,但由于您受限于使用 Java 应用程序,您可以尝试使用正则表达式来解析日志文件并获取查询。可以找到一些代码帮助 here .
假设您无法编辑 DAO.java
,我将发布一个答案。如果你可以编辑 DAO.java
引入一些像 ||<<
这样的字符来标记打印查询的开始和结束。这样您就不会列出所有 SQL 命令的详尽列表。
public static void main(String[] args) throws IOException {
long start = System.currentTimeMillis();
FileInputStream inputStream = null;
Scanner sc = null;
try {
inputStream = new FileInputStream("C:\Users\absin\Desktop\catalina.out");
sc = new Scanner(inputStream, "UTF-8");
while (sc.hasNextLine()) {
String line = sc.nextLine();
if (line.toLowerCase().contains("select ") || line.toLowerCase().contains("insert ")
|| line.toLowerCase().contains("update ")) {
// DO something with the found log entry
System.out.println(line);
}
}
// note that Scanner suppresses exceptions
if (sc.ioException() != null) {
throw sc.ioException();
}
} finally {
if (inputStream != null) {
inputStream.close();
}
if (sc != null) {
sc.close();
}
}
System.out.println("Time taken : " + (System.currentTimeMillis() - start) + " milliseconds");
}
它会打印很多带有查询的日志行,在一个 40 MB 的日志文件上大约需要 12 秒。如果您熟悉它们,您也可以使用正则表达式。
我需要通过遵循面向对象的设计模式来开发 JAVA 应用程序,以便从 Tomcat 日志中提取 sql 查询。我有日志文件。我需要从该文件中提取 sql 查询。 我是这个领域的新手。我需要了解哪些基础知识才能做到这一点或提供一些好的参考资料。
由于我无法共享整个日志文件,所以我只共享其中的一部分:
(Dao.java:执行:73) SELECT ORDER_STATUS_TYPE_ID, 来自 ORD.ORDER_STATUS_TYPE 的名称 [调试] [RMI TCP 连接 (5)-127.0.0.1 2018 年 2 月 5 日 15:00:10] (TraceInterceptor.java:writeToLog:26) []离开 TypeDaoImpl.getOrderStatusType(): 1062ms: [com.xyz.abc.api.is.model.type.OrderStatusType@2ac9ecc3,com.xyz.abc.api.is.model.type.OrderStatusType@76777395,com.xyz.abc.api.is.model.type.OrderStatusType@6ad8ddb7,com.xyz.abc.api.is.model.type.OrderStatusType@6738868f,com.xyz.abc.api.is.model.type.OrderStatusType@272c15f,
您的问题表明您已经有一个包含 SQL 的日志文件。虽然有更好更快的方法来使用不同的操作系统工具解析此文件,但由于您受限于使用 Java 应用程序,您可以尝试使用正则表达式来解析日志文件并获取查询。可以找到一些代码帮助 here .
假设您无法编辑 DAO.java
,我将发布一个答案。如果你可以编辑 DAO.java
引入一些像 ||<<
这样的字符来标记打印查询的开始和结束。这样您就不会列出所有 SQL 命令的详尽列表。
public static void main(String[] args) throws IOException {
long start = System.currentTimeMillis();
FileInputStream inputStream = null;
Scanner sc = null;
try {
inputStream = new FileInputStream("C:\Users\absin\Desktop\catalina.out");
sc = new Scanner(inputStream, "UTF-8");
while (sc.hasNextLine()) {
String line = sc.nextLine();
if (line.toLowerCase().contains("select ") || line.toLowerCase().contains("insert ")
|| line.toLowerCase().contains("update ")) {
// DO something with the found log entry
System.out.println(line);
}
}
// note that Scanner suppresses exceptions
if (sc.ioException() != null) {
throw sc.ioException();
}
} finally {
if (inputStream != null) {
inputStream.close();
}
if (sc != null) {
sc.close();
}
}
System.out.println("Time taken : " + (System.currentTimeMillis() - start) + " milliseconds");
}
它会打印很多带有查询的日志行,在一个 40 MB 的日志文件上大约需要 12 秒。如果您熟悉它们,您也可以使用正则表达式。