2014-01-22 4 views
3

Есть ли какие-либо grep-подобные инструменты командной строки Unix/Linux, которые понимают стек стека Java в файлах журналов, которые печатаются log4j или logback? Инструмент должен понимать, что stacktrace состоит из нескольких строк.Stacktrace aware grep

Типичный пример использования - отфильтровывать определенные исключения и соответствующие стеки стека при просмотре журналов, которые хранятся в файлах.

+0

Поскольку вы упоминаете 'grep', вы на платформа * nix? – devnull

+0

Должно быть возможно добиться того, что вы хотите использовать 'sed' или аналогичные утилиты, но вам нужно предоставить некоторые данные образца ... – devnull

+0

@devnull: Я использую Linux. –

ответ

0

Я не знаю, отвечает ли это на ваш вопрос, но когда я хочу получить стек, я использую grep -A, чтобы получить строки сразу после строки, которую я ищу.

Например: grep -A 200 "2014-09-08/12:11:36.110" catalina.out

2

Я использую следующую SED программы одна строки:

sed -nr ':main; /^[0-9 :,-]{23} ERROR/{ :loop; p; n; /^[0-9 :,-]{23}/b main; b loop}' 

Первый [0-9 :,-]{23} признает запись журнала старта. Сразу после него перед косой чертой вы можете написать дополнительное регулярное выражение, чтобы ограничить, какие записи печатать. Выражение в {...} проходит через следующие строки до тех пор, пока не будет найден новый заголовок записи.

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

2015-08-25 12:49:34,906 ... 

и печатает все записи с трассировки стека, который имеет ошибку после начала записи. Пример:

2015-08-25 12:49:34,906 ERROR [http-8080-89] [[email protected]] NullPointerException: 
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 
... 

СЭД Программа Объяснение

СЭД выражение Программа /regexp/ command средства: если текущая строка соответствует регулярное выражение команды запуска.

sed прочитает строку ввода и запустит программу. Когда строка соответствует /^[0-9 :,-]{23} ERROR /, она запускает командный блок {...}, если нет, то после завершения программы sed не будет выводить текущую строку на вывод (опция -n), тогда sed считывает следующую строку и снова запускает программу. Это повторяется до конца ввода.

{...} объяснение:

  1. p - напечатать текущую строку
  2. n - читать следующую строку
  3. /^[0-9 :,-]{23}/b main - если строка соответствует регулярное выражение по-прежнему на этикетке :main - эффективно перезапустив всю программу на экране текущая строка без прочтения следующей строки - не пропустить следующее возможное исключение
  4. Продолжить на этикетке :loop

Так регэкспы:

  1. /^[0-9 :,-]{23} ERROR / матчей линии, начинается запись журнала
  2. /^[0-9 :,-]{23} / матчи линия, следующая запись журнала
+0

Не могли бы вы сформулировать немного больше о том, как эта команда работает для тех из нас, кто не является экспертом в sed? Я понимаю, что команды «b» означают «goto» указанную метку. Что делают команды «p» и «n»? – Dasmowenator

+0

Я обновил ответ с объяснением программы. Тем не менее команды 'n',' p' можно легко найти в документации sed. –