我正在为一个日志分析器系统工作,它读取 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-16在log_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_current
和 log_past
。您可以将所有行插入同一个表中,比如 logs
并使用检索
select * from logs where id = (select id from log_record where savedDate = 'YOUR_DATE')
这将为您提供特定日期的所有日志。
现在,一旦您能够使用上述方式删除表之间的当前和过去的区别,我认为您在这里提出的问题就会得到解决。 :)
关于java - 寻找与数据库设计相关的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5024313/