java - 寻找与数据库设计相关的方式

标签 java database tomcat scheduled-tasks logging

我正在为一个日志分析器系统工作,它读取 tomcat 的日志并通过网页中的图表/表格显示它们。 (我知道有一些现有的日志分析系统,我正在重新造轮子。但这是我的工作,我的老板想要它。)

我们的 tomcat 日志按天保存。例如:

2011-01-01.txt
2011-01-02.txt
......

下面是我导出日志到db读取的方式:

1 The DB structure

我有三个表: 1)log_current:保存今天产生的日志。

2)log_past:保存今天之前产生的日志。

以上两个表拥有相同的模式。

+-------+-----------+----------+----------+--------+-----+----------+----------+--------+---------------------+---------+----------+-------+
| Id    | hostip    | username | datasend | method | uri | queryStr | protocol | status | time                | browser | platform | refer |
+-------+-----------+----------+----------+--------+-----+----------+----------+--------+---------------------+---------+----------+-------+
| 44359 | 127.0.0.1 | -        |        0 | GET    | /   |          | HTTP/1.1 |    404 | 2011-02-17 08:08:25 | Unknown | Unknown  | -     |
+-------+-----------+----------+----------+--------+-----+----------+----------+--------+---------------------+---------+----------+-------+

3)log_record:保存log_past的信息,记录日志导出到log_past表的天数。

+-----+------------+
| Id  | savedDate  |
+-----+------------+
| 127 | 2011-02-15 |
| 128 | 2011-02-14 |
..................
+-----+------------+

表格显示2011-02-15的日志已经导出。

2 Export(to db)

我有两个时间表工作。

1) 白天工作。

00:05:00,查看tomcat日志目录(/tomcat/logs),找到所有最近30天的日志文件(当然也包括昨天的日志)

查看log_record表是否导出了一天的日志,比如2011-02-16log_record中没有,所以我会去读2011-02-16.txt,导出到log_past。

昨天的日志导出后,不管今天的日志(2011-02-17.txt)是否存在,我都启动了文件监控。

2)文件监控

一旦监视器启动,它会每小时读取文件。它读取的每条日志都会保存在log_current表中。

3 tomcat server restart.

有时我们必须重启tomcat,所以一旦tomcat启动,我会删除log_current的所有日志,然后做日常工作

4 My problem

1) 两个表(log_current 和 log_past)。

因为如果我将今天的日志保存到log_past,我不能确保所有的日志文件(xxxx-xx-xx.txt) 都导出到db。因为我会在每天00:05:00检查,确保必须导出今天之前的日志。

但这使得查询过去和今天的日志变得困难。

比如查询从2011-02-14 00:00:00到2011-02-15 00:00:00,这些log必须在log_past。

但是 从 2011-02-14 00:00:00 到 2011-02-17 08:00:00 怎么样?(假设是 2011-02-17 09:00:00 现在)。

跨表查询比较复杂。

另外,我一直觉得我对表格的设计和工作方式(导出/读取的计划工作)并不完美,所以谁能给个好的建议?

我只需要导出和读取日志并且可以进行几乎实时的分析,其中实时意味着我必须通过图表/表格等使当天的日志可见。

最佳答案

首先,IMO 你不需要 2 个不同的表 log_currentlog_past。您可以将所有行插入同一个表中,比如 logs 并使用检索 select * from logs where id = (select id from log_record where savedDate = 'YOUR_DATE') 这将为您提供特定日期的所有日志。

现在,一旦您能够使用上述方式删除表之间的当前和过去的区别,我认为您在这里提出的问题就会得到解决。 :)

关于java - 寻找与数据库设计相关的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5024313/

相关文章:

用于匹配来自记录器的异常堆栈跟踪的 Java 正则表达式

Java错误: Bad Operand Type for binary operator <

java - Oracle工作流API : adding and accessing file Attachments to a Human Task

java - 如何在tomcat服务器中管理多个war应用程序?

jsp - 是否可以缓存 JSP 字节码以避免使用 Tomcat 重新编译?

java - 启动tomcat 7抛出两个异常,End事件和web.xml解析

java - 如何使用 netbeans Swing GUI 构建器

database - 面向对象编程和数据库管理

php - Laravel 中缓慢的 MySQL 查询在其他地方却很快

java - Grails 框架方法 addTo 在多次调用时抛出异常