我正在为一个日志分析器系统工作,该系统读取tomcat的日志并通过网页中的图表/表格显示它们。(我知道有一些现成的日志分析器系统,我正在重新创建轮子。但这是我的工作,我的老板想要。)
我们的tomcat日志按天保存。例如:
2011-01-01.txt 2011-01-02.txt ......
以下是我将日志导出到db并读取它们的方式:
1数据库结构
我有三个表:1)log_current:保存今天生成的日志。
2)log_past:保存今天之前生成的日志。
上面两个表拥有SAME模式。
+-------+-----------+----------+----------+--------+-----+----------+----------+--------+---------------------+---------+----------+-------+ | 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至08:00:00 2011-02-17 ?(假设它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') 这将为您提供特定日期的所有日志。
log_current
log_past
logs
select * from logs where id = (select id from log_record where savedDate = 'YOUR_DATE')
现在,一旦您能够使用上述方法消除表格之间的当前和过去区别,我认为您在此处提出的问题将得到解决。:)