用正则表达式解析日志

时间:2011-06-10 11:27:51

标签: java regex logging jboss

我正在尝试将JBoss日志解析为retreive错误消息等。 这是我使用的模式: ([0-9]+-[0-9]+-[0-9][0-9]) .*? ((?:ERROR .*? .*?|WARN .*? .*?)) (.*? .* (?!at).*? .*\sjava.*)

*\sjava.*部分应该在下一行中检索NullPointer异常。

当我在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(空格)?

3 个答案:

答案 0 :(得分:0)

不 - 您已正确转义\s

答案 1 :(得分:0)

你的正则表达式使得非常重的贪婪匹配。我认为你应该对你的各种不那么贪心

.*

根据日志文件的大小,它们往往会占用大量CPU资源......但是,如果没有示例日志,很难说,如何改进正则表达式

答案 2 :(得分: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])"));