总结
我正在尝试使用 grep 命令从日志文件中获取日志。但是,我可以匹配时间戳,但没有得到我需要的完整堆栈跟踪。
日志文件示例
[1/10/16 23:55:33:018 PST] 00000057 ServerObj E SECJ0373E: Exception message
at com.own.ws.wim.util.UniqueNameHelper.formatUniqueName(UniqueNameHelper.java:102)
at com.own.ws.wim.ProfileManager.getImpl(ProfileManager.java:1569)
我尝试过的
我能够获取日志条目,但我也想要堆栈跟踪。我试过:
$ grep -i '^[[:space:]]*at' --before-context=2 SystemOut.log |
grep "1/13/16 7:[1-60]"
[1/10/16 23:55:33:018 PST] 00000057 ServerObj E SECJ0373E: Exception message
知道如何实现吗?
最佳答案
(来 self 的回答:https://stackoverflow.com/a/16064081/430128)
这是一个快速而复杂的 grep 表达式...如果您使用的是 log4j 之类的记录器,则异常的第一行通常包含 WARN
或 ERROR
, 下一行将包含异常名称和可选的消息,然后后续堆栈跟踪将以下列之一开始:
-
"\tat"
(制表符 +at
) -
"Caused by: "
-
"\t... <some number> more"
(这些行指示堆栈中未显示在“由”异常中显示的帧数) - 堆栈前的异常名称(可能还有消息)
我们要获取上面所有的行,所以grep表达式为:
grep -P "(WARN|ERROR|^\tat |Exception|^Caused by: |\t... \d+ more)"
它假设异常类总是包含单词 Exception
这可能是真的,也可能不是真的,但这毕竟是快速而肮脏的。
根据您的具体情况进行必要的调整。
关于java - 如何使用 grep 从日志文件捕获 Java 异常,包括堆栈跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34788252/