2011-02-17 68 views
0

我正在爲日誌分析系統工作,它讀取tomcat的日誌並通過網頁中的圖表/表格顯示它們。我知道有一些日誌分析系統,我正在重新創建輪子,但這是我的工作,我的老闆想要它。)尋找一個數據庫設計相關的方式

我們的tomcat日誌在白天保存。例如:

2011-01-01.txt 
2011-01-02.txt 
...... 

以下是我的方式出口日誌DB和閱讀:

1 DB結構

我有三個表: 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出口(到DB)

我有兩個時間表的工作。

1)日常工作。

00:05:00,檢查Tomcat的日誌目錄(/ tomcat的/日誌)找到所有的近30日日誌文件(當然也包括昨天的日誌

檢查log_record表看看是否有一天原木出口,例如2011-02-16log_record沒有找到,所以我會讀2011-02-16.txt,並導出他們log_past。

昨天的出口日誌之後,我啓動了今天的日誌(2011-02-17.txt)的文件監視器,不管它是否存在。

2)文件監控

一旦監控啓動時,它會按小時讀取該文件小時。它讀取的每個日誌都將保存在log_current表中。

3 tomcat服務器重啓。

有時我們不得不重新啓動Tomcat,所以一旦Tomcat啓動時,我會刪除log_current的所有日誌,然後做日常工作

4我的問題

1)2表(log_current和log_past)。

因爲如果我救了今天的日誌log_past,我不能確保所有的日誌文件(XXXX-XX-xx.txt)遠銷分貝。因爲我會每天在00:05:00進行檢查,確保今天之前的日誌必須導出。

但是,這使得很難查詢日誌accros yestersay和今天。

例如,查詢從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現在) 。

跨表查詢非常複雜。

而且,我一直認爲我的表和工作方式德興(出口的日程工作/讀取)是不完美的,所以任何人都可以給一個很好的建議?

我只需要導出和讀取日誌,並可以做幾乎實時的分析,其中實時意味着我必須作出由圖/表當天visiable的日誌等

回答

0

首先,海事組織你不需要2個不同的表log_currentlog_past。您可以在同一個表中插入的所有行,說logs使用 select * from logs where id = (select id from log_record where savedDate = 'YOUR_DATE') 這會給你的特殊日子的所有日誌檢索。

現在,一旦您能夠使用上述方式刪除當前和過去表格之間的區別,我認爲您在這裏問的問題將得到解決。 :)

+0

插入與文件監視器的工作,它按小時讀取文件,所以如果它讀取一些日誌,但這些日誌不會導出到數據庫然後服務器由於某種原因關閉?它會錯過這些日誌。 – hguser 2011-02-17 05:42:37