Stacktrace感知grep

Juh*_*älä 5 java logging grep stack-trace

是否有任何类似grep的Unix / Linux命令行工具能够理解log4j或logback打印的日志文件中的Java堆栈跟踪?该工具应了解stacktrace由几行组成。

典型的用例是在查看存储到文件的日志时过滤掉某些异常和相应的堆栈跟踪。

Mas*_*sáč 6

我正在使用以下sed一行程序:

sed -nr ':main; /^[0-9 :,-]{23} ERROR / { :loop; p; n; /^[0-9 :,-]{23} / b main; b loop}'
Run Code Online (Sandbox Code Playgroud)

第一个[0-9 :,-]{23}识别日志记录开始。在斜线之后,您可以立即编写其他正则表达式以限制要打印的记录。表达式在{...}以下各行中循环,直到找到新的记录头为止。

我的程序适用于日志记录以以下内容开头的日志:

2015-08-25 12:49:34,906 ...
Run Code Online (Sandbox Code Playgroud)

并在记录开始后打印所有带有错误的堆栈跟踪记录。例:

2015-08-25 12:49:34,906 ERROR [http-8080-89] [Error@112] 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)
...
Run Code Online (Sandbox Code Playgroud)

sed程序说明

sed程序表达式/regexp/ command表示:如果当前行与regexp run命令匹配。

sed将读取输入行并运行程序。当该行匹配时,/^[0-9 :,-]{23} ERROR /它运行命令块{...},如果没有,则由于程序结束,sed将不打印当前行以输出(选项-n),然后sed读取下一行并再次运行程序。重复直到输入结束。

{...} 说明:

  1. p -打印当前行
  2. n -阅读下一行
  3. /^[0-9 :,-]{23} / b main-如果该行与regexp相匹配,则在标签处继续:main-有效地在当前行上重新运行整个程序,而无需读取下一行-不要错过下一个可能的异常
  4. 继续标签 :loop

所以正则表达式:

  1. /^[0-9 :,-]{23} ERROR / 匹配开始日志记录的行
  2. /^[0-9 :,-]{23} / 匹配下一条日志记录的行


Ant*_*ero 0

我不知道这是否回答了您的问题,但是当我想获取堆栈跟踪时,我会使用grep -A它来获取我要查找的行之后的行。

例如: grep -A 200 "2014-09-08/12:11:36.110" catalina.out