2011-07-09 64 views
0

我正在使用Log4j LogFilePatternReceiver類讀取一些簡單的日誌文件,並想知道是否有任何方式告訴Log4j將格式修改器解釋爲可選。Log4j可選格式修飾符和LogFilePatternReceiver正則表達式匹配

例如,假定下面的模式:

%r [%t] %p %c %x - %m%n 

匹配字符串

123 [main] INFO org.apache.log4j.whatever x=8 - Just a message. 

但不是字符串

123 [main] INFO org.apache.log4j.whatever - Just a message. 

(即,與上述相同,但不「x = 8」部分)。

有什麼辦法告訴Log4j匹配嗎?

在另一個相關的筆記,把一些額外的打印語句中的LogFilePatternReceiver的源代碼,我得到

Pattern: {%r [%t] %p %c %x - %m%n} 
Regex: {(.*?)[ ]+\[(.*?)\][ ]+(\S*\s*?)[ ]+(\S*\s*?)[ ]+(.*)[ ]+\-[ ]+(.*?)} 

在括號只是表示每個表達式的開始/結束不屬於它,只是爲了確保沒有多餘的空格或其他字符。正則表達式由LogFilePatternReceiver創建,其initialize()方法結束。

試圖在regexpal.com正則表達式,得到了一個匹配只對部分不包括該信息,即匹配,根據regexpal,

123 [main] INFO org.apache.log4j.whatever x=8 - 

(具有在端部的空間)。顯然,正則表達式需要用$符號來關閉消息才能包含。

我在模式定義中犯了什麼錯誤嗎?

回答

0

最後一個括號包含一個惰性量詞:.*?表示「匹配零個或多個字符,儘可能少」。這意味着空字符串是一個有效的匹配(這在你的正則表達式的其他部分是有意義的,因爲有些東西是你不想被正則表達式的前一部分吞噬的)。

使用.*代替,這意味着 「匹配零個或多個字符,儘可能多的」:

(.*?) +\[(.*?)\] +(\S*\s*?) +(\S*\s*?) +(.*) +- +(.*) 
+0

是的,但我不控制該正則表達式,它由Log4j的LogFilePatternReceiver類生成。 :-) – PNS

0

試試這個LogFormat的爲您LogFilePatternReceiver(注意通配符*)

PROP(RELATIVETIME) THREAD] LEVEL LOGGER * PROP(X) - MESSAGE