从tomcat日志中提取sql查询

时间:2018-02-06 06:21:54

标签: java sql tomcat logging extraction

我需要按照面向对象的设计模式开发JAVA应用程序,以便从Tomcat日志中提取SQL查询。我有日志文件。我需要从该文件中提取sql查询。 我是这个领域的新手。我需要知道的基本知识是什么,或提供一些很好的参考。

由于我无法共享整个日志文件,我正在分享其中的一部分:

(Dao.java:execute:73)SELECT ORDER_STATUS_TYPE_ID,NAME FROM ORD.ORDER_STATUS_TYPE [DEBUG] [RMI TCP Connection(5)-127.0.0.1 05 Feb 2018 15:00:10](TraceInterceptor.java:writeToLog:26)[] Leaving 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,

2 个答案:

答案 0 :(得分:0)

我发布的答案是假设您无法修改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秒。如果您熟悉它们,也可以使用正则表达式。

答案 1 :(得分:-1)

您的问题表明您已经有一个包含SQL的日志文件。尽管使用不同的操作系统工具可以更好,更快地解析此文件,但由于您受限于使用Java应用程序,因此您可以尝试使用正则表达式来解析日志文件并获取查询。可以找到一些代码帮助here