是否有类似grep的Unix / Linux命令行工具可以理解由log4j或logback打印的日志文件中的Java堆栈跟踪?该工具应该理解堆栈跟踪由多行组成。
典型的用例是在查看存储到文件的日志时过滤掉某些异常和相应的堆栈跟踪。
答案 0 :(得分:5)
我使用了以下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 ...
打印所有带有堆栈跟踪的记录,这些记录在记录开始后具有ERROR。例如:
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)
...
sed程序说明
sed程序表达式
/regexp/ command
表示:如果当前行与regexp run命令匹配。
sed将读取输入行并运行程序。当行匹配/^[0-9 :,-]{23} ERROR /
时,它运行命令块{...}
,如果没有,则程序结束后,sed将不打印当前行输出(选项-n),然后sed读取下一行并运行该计划再次。这将重复直到输入结束。
{...}
解释:
p
- 打印当前行n
- 阅读下一行/^[0-9 :,-]{23} / b main
- 如果该行匹配正则表达式继续标签:main
- 有效地重新运行当前行上的整个程序而不读取下一行 - 不会错过下一个可能的异常:loop
所以regexps:
/^[0-9 :,-]{23} ERROR /
匹配启动日志记录的行/^[0-9 :,-]{23} /
匹配下一个日志记录答案 1 :(得分:0)
我不知道这是否能回答你的问题,但是当我想要获得堆栈跟踪时,我会使用grep -A
来获取我正在寻找的行之后的行。
例如:
grep -A 200 "2014-09-08/12:11:36.110" catalina.out