2011-06-10 186 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