Разбор логов с помощью регулярных выражений - PullRequest
0 голосов
/ 10 июня 2011

Я пытаюсь проанализировать журналы 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 (пробелы)?

Ответы [ 3 ]

0 голосов
/ 10 июня 2011

Ваше регулярное выражение делает очень тяжелые жадные совпадения. Я думаю, что вы должны быть немного менее жадным со своими различными

.*

В зависимости от размера ваших файлов журналов, они, как правило, сильно нагружают процессор ... Однако без примеров журналов трудно сказать, как вы можете улучшить регулярное выражение

0 голосов
/ 10 июня 2011

Вы можете ожидать ноль или более пробелов . Попробуйте \\s*java.*


EDIT : Используйте DOTALL Pattern.

    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 голосов
/ 10 июня 2011

Нет - вы бежали \s правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...