【问题标题】:look for a database design related manner寻找数据库设计相关的方式
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 插入与文件监视器一起工作,它按小时读取文件,那么如果它读取一些日志,但这些日志没有导出到数据库,那么服务器由于某种原因关闭了呢?它会错过这些日志。
    • 顺便说一句,我的选择经常使用:select xxx from log_past where time between xxx and xxx.
    • 对于插入,我认为tomcat异常关闭没有什么解决办法。您将不得不增加日志写入的频率。其次,您可以在桌子上拥有索引。 (提示聚集索引)
    猜你喜欢
    • 2011-01-25
    • 1970-01-01
    • 2011-10-18
    • 2021-07-22
    • 1970-01-01
    • 2011-02-17
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多