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

时间:2011-02-17 01:56:06

标签: java database tomcat scheduled-tasks logging

我正在为日志分析器系统工作,该系统读取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>在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进行检查,以确保必须导出今天之前的日志。

但这使得查询yesus和今天的日志很困难。

例如,查询从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 立即)。

跨表查询很复杂。

另外,我一直认为我对桌子和工作方式的设计(出口/阅读的安排工作)并不完美,所以任何人都可以给出一个好的建议吗?

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

1 个答案:

答案 0 :(得分:0)

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

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