首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从tomcat日志中提取sql查询

从tomcat日志中提取sql查询
EN

Stack Overflow用户
提问于 2018-02-06 14:21:54
回答 2查看 921关注 0票数 1

我需要遵循面向对象的设计模式来开发一个JAVA应用程序,以便从Tomcat日志中提取sql查询。我有日志文件。我需要从该文件中提取sql查询。我是这个领域的新手。我需要知道什么基础知识才能做到这一点,或者给出一些好的参考资料。

因为我不能分享整个日志文件,所以我只分享了其中的一部分:

(Dao.java:execute:73) SELECT ORDER_STATUS_TYPE_ID,NAME FROM ORD.ORDER_STATUS_TYPE DEBUG (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,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-06 17:29:34

我发布了一个答案,假设你不能编辑DAO.java。如果可以编辑DAO.java,可以引入一些字符,比如||<<来标记打印查询的开始和结束。这样您就不需要列出所有SQL命令的详尽列表。

代码语言:javascript
运行
复制
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");
    }

它打印了很多查询日志行,在一个40MB的日志文件上需要大约12秒。如果您熟悉正则表达式,也可以使用正则表达式。

票数 0
EN

Stack Overflow用户

发布于 2018-02-06 14:56:51

您的问题表明您已经有一个包含SQL的日志文件。虽然有很多更好更快的方法可以使用不同的操作系统工具来解析这个文件,但是由于您受到使用Java应用程序的限制,您可以尝试使用正则表达式来解析日志文件并获取查询。有关代码的一些帮助可以在here中找到。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48636681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档