2011-05-05 89 views
1

我有關於程序體系結構的問題。 假設你有100種不同格式的日誌文件,你需要解析並將這些信息放入SQL數據庫中。 我的它的觀點是這樣的:解析Perl程序結構

  1. 使用一般的配置文件,如:

    program1->name1("apache",/var/log/apache.log) (modulename,path to logfile1) 
    program2->name2("exim",/var/log/exim.log) (modulename,path to logfile2) 
    
    .... 
    
    sqldb->configuration 
    
  2. 使用類似的模塊(每個節目1個文件)type1.module(正則表達式,logstructure(somevariables) ,sql(表和函數))

  3. 對於不同的程序,fork或線程進程(不知道現在Linux上哪些更好)。

所以問題是,我認爲這是正確的?我應該爲每個程序使用一個模塊(web/MTA/iptablat) 或者有更好的方法?我認爲一些正則表達式會是一樣的,比如date/time/ip/url。該怎麼做?或者我錯過了什麼?


例如:MTA的exim4 mainlog

2011-04-28 13時16分24秒1QFOGm-0005nQ-Ig的 < = [email protected]** H =本地主機 (exim.mydomain.org.ua) [127.0.0.1]:51127 I = [127.0.0.1]:465 P = esmtpsa X = TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32 CV =無A = plain_server :垃圾郵件S = 763 = ID 1303985784.4db93e788cb5c @ mydomain.org.ua T = 從 < [email protected]>爲 [email protected] 「測試」

所有加粗的已經被解析並將被放入sqldb.incoming表中。現在即時通訊在Perl具有結構來保存每一個解析變量像$exim->{timstamp} or $exim->{host}->{ip}

我的計劃會做這樣的事情tail -f /file和線

的flexability線分析它:讓說,我想supprot添加到Apache服務器(只時間戳USERIP和文件下載)。所有我需要知道什麼日誌文件解析,什麼正則表達式應該是什麼,什麼樣的SQL結構應該是。所以即時計劃有這樣一個模塊。只需使用參數(日誌文件,文件類型)對主進程進行分支或線程化即可。也許還我想補充一些選項有什麼不解析(也許有些日誌級別低,你只是沒有看到mutch有)

+0

你想要什麼樣的數據有在數據庫畢竟是?你是否期望應用程序列表增長(例如,後綴)?您對靈活性有什麼期望? – Dallaylaen 2011-05-05 14:28:39

+0

我更新了我的問題。現在是更清楚還是添加更多東西? – MealstroM 2011-05-05 14:57:24

回答

0

我會做這樣的:

  1. 創建一個配置文件,該文件被格式化像這樣:appname:logpath:logformatname
  2. 創建一個從基類解析器類繼承的Perl類的集合。
  3. 編寫一個腳本,它加載配置文件,然後遍歷其內容,將每個迭代傳遞給其相應的處理程序對象。

如果你想要一個步驟1和2的例子,我們有一個on our project。請參閱MT :: FileMgr和MT :: FileMgr :: * here

+0

我忘記了課程。這聽起來不錯。你認爲SQL驅動程序也應該在這個類中嗎? – MealstroM 2011-05-05 17:02:10

0

日誌監控工具wots可能會爲您在這裏做很多繁重的工作。它作爲一個守護進程運行,可以根據需要查看盡可能多的日誌文件,運行perl正則表達式的任意組合,並在發現匹配時執行某些操作。

我會傾向於修改wots本身(它的許可證自由允許)來支持數據庫寫入方法 - 查看其現有的handle_*方法。

大部分的努力工作已經完成,你可以解決有趣的問題。

0

我認爲File :: Tail是一個不錯的選擇。 可以使文件::尾對象的數組,並選擇這樣的輪詢他們:

while (1) { 
     ($nfound,$timeleft,@pending)= 
     File::Tail::select(undef,undef,undef,$timeout,@files); 
     unless ($nfound) { 
       # timeout - do something else here, if you need to 
     } else { 
      foreach (@pending) { 
       # here you can handle log messages depending on filename 
       print $_->{"input"}." (".localtime(time).") ".$_->read; 
     } 

(Perl的文件::尾DOC)