【发布时间】:2011-06-28 19:13:24
【问题描述】:
我正在为一个日志分析系统工作,它读取 tomcat 的日志并通过网页中的图表/表格显示它们。 (我知道有一些现有的日志分析系统,我正在重新创建轮子。但这是我的工作,我的老板想要它。)
我们的 tomcat 日志按天保存。例如:
2011-01-01.txt
2011-01-02.txt
......
以下是我将日志导出到数据库并读取它们的方式:
1 数据库结构
我有三张桌子: 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 导出(到数据库)
我有两个计划工作。
1) 日常工作。
00:05:00,查看tomcat日志目录(/tomcat/logs),找到所有最近30天的日志文件(当然包括昨天的日志。
查看log_record表,看是否导出了一天的日志,例如log_record中找不到2011-02-16,所以我会看2011-02-16.txt,并导出到log_past。
导出昨天的日志后,无论是否存在,我都会启动今天的日志(2011-02-17.txt)的文件监控。
2)文件监视器
一旦监视器启动,它将每小时读取文件。它读取的每条日志都会保存在 log_current 表中。
3 tomcat服务器重启。
有时我们要重启tomcat,所以一旦tomcat启动,我会删除log_current的所有日志,然后做日常工作。
4 我的问题
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_past。
但是 从 2011-02-14 00:00:00 到 2011-02-17 08:00:00 怎么样?(假设是 2011-02-17 09:00:00 现在)。
跨表查询很复杂。
另外,我一直觉得我对表格的设计和工作方式(导出/读取的调度工作)不够完善,谁能给点好的建议?
我只需要导出和读取日志,并且可以进行几乎实时的分析,其中实时意味着我必须通过图表/表格等使当天的日志可见。
【问题讨论】:
标签: java database tomcat scheduled-tasks logging