【问题标题】:Parsing logs with regex使用正则表达式解析日志
【发布时间】:2011-09-12 10:30:47
【问题描述】:

我正在尝试解析 JBoss 日志以检索错误消息等。 这是我正在使用的模式: ([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(空格)?

【问题讨论】:

  • 举个日志例子。您可能在正则表达式中有一个杂散空间

标签: java regex logging jboss


【解决方案1】:

不 - 你已经正确地逃脱了\s

【讨论】:

    【解决方案2】:

    您的正则表达式进行了非常严重的贪婪匹配。我认为你应该对你的各种贪婪少一点

    .*
    

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

    【讨论】:

      【解决方案3】:

      您可能期望零个或多个空格字符。试试\\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])"));
      

      【讨论】:

      • 试过了,程序还是死机。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 2015-09-06
      相关资源
      最近更新 更多