2012-03-09 62 views
0

一些上下文解析日誌串成可用份

我在寫將要供給串/數據的連續流的應用程序。數據是日誌消息,但來自不同的機器和不同的應用程序。所以他們的格式可能會略有不同。

我的目標是從每條消息中獲取單個組件,並且不管源是否嘗試以某種方式規範化數據,以便通用部分(如主機,線程,時間,消息和級別)。

問題

  1. 是否log4j的有這樣的事情任何支持?即用一個字符串返回某種可用於獲取前面提到的部分的對象?
  2. 如果沒有,是否有任何庫可用於執行此操作或類似的操作?
  3. 理想情況下,如果我可以提供多種模式進行匹配,並且在默認情況下使用後退功能,則其他模式都不匹配。像這樣嗎?

我知道的東西像Awstats的做日誌分析並沒有什麼,但在這種情況下,我只有兩個選擇是使用它做一個庫或寫東西,我寧願不推倒重來。

+1

如果你寧願沒有重新發明輪子 - 爲什麼不使用類似的Splunk(HTTP:// WWW。 splunk.com/)。 – Nim 2012-03-09 11:13:22

回答

3

您可以使用解析器組合器。例如。這個解析整數的元組:

import scala.util.parsing.combinator.RegexParsers 

object Parser extends RegexParsers { 
    def intPair = INT ~ "," ~ INT ^^ { x => (x._1._1.toInt,x._2.toInt) } 
    val INT = "[0-9]+".r 
} 


Parser.parseAll(Parser.intPair, "10,22") // => (10,22) 

這裏是一個很好的起點:http://www.codecommit.com/blog/scala/the-magic-behind-parser-combinators

+0

這是一個很棒的想法,我之前和他們一起玩過,但從來沒有真正的用例。完全忘記他們甚至存在。有沒有辦法使默認匹配,以防其中一種格式不符合預期? – zcourts 2012-03-10 09:02:12