2011-06-10 191 views
0

我想解析JBoss日誌來檢索錯誤消息等。 這是我使用的模式: ([0-9]+-[0-9]+-[0-9][0-9]) .*? ((?:ERROR .*? .*?|WARN .*? .*?)) (.*? .* (?!at).*? .*\sjava.*)用正則表達式解析日誌

*\sjava.*部分應該是中檢索空指針異常下一行。

當我在http://www.regexplanet.com/simple/上測試它(選中UNIX_LINES選項)時,一切正常。但是,當我在java代碼中使用相同的模式時,沒有什麼是輸出,我的程序凍結。 Pattern p = Pattern.compile("([0-9]+-[0-9]+-[0-9][0-9]) .*? ((?:ERROR .*? .*?|WARN .*? .*?)) (.*? .* (?!at).*? .*\\sjava.*)", Pattern.UNIX_LINES);

當我從模式中刪除\sjava.*時,一切也都正常。

這是從日誌文件的示例:

2011-06-08 03:28:48,408 INFO [STDOUT] (http-exxample.com%2F10.8.238.48-8180-7) 2011-06-08 03:28:48,403 WARN [http-example.com%2F10.8.238.48-8180-7] interceptors.WebFault (WebFault.java:125) - Exception occurred while writing fault.

java.lang.NullPointerException

一切都在除java.lang.NullPinterException單行。

java是否需要任何特殊的方式轉義\s(空格)?

+0

給出一個日誌的例子。您可能在正則表達式中有一個流浪空間 – Bohemian 2011-06-10 11:34:31

+0

已添加示例。 – ddario 2011-06-10 11:48:08

回答

0

您的正則表達式使得非常沉重的貪婪匹配。我想你應該與你的各種

.* 

根據日誌文件的大小有點貪心不足,他們往往是非常CPU密集型......這很難不例如日誌說,不過,如何您可以改進正則表達式

0

您可能會期望零個或多個空格字符。嘗試\\s*java.*


編輯: 使用DOTALL模式。

String s = "2011-06-08 03:28:48,403 WARN [http-example.com%2F10.8.238.48-8180-7] interceptors.WebFault (WebFault.java:125) " 
     + "- Exception occurred while writing fault." 
     + "\n\n java.lang.NullPointerException\n"; 
    System.out.println(s.matches("(?s)([0-9]+-[0-9]+-[0-9][0-9]) .*? " 
     + "((?:ERROR .*? .*?|WARN .*? .*?)) (.*? .* (?!at).*? .*\\sjava.*[\n])")); 
+0

嘗試過,程序仍然凍結。 – ddario 2011-06-10 11:46:56

+0

@ddario:現在試試。 – 2011-06-10 12:14:15