Java正则表达式匹配来自日志记录器的异常堆栈跟踪

3
我有以下正则表达式,是从Regular expression to parse a log file and find stacktraces中获得的。 ^.+Exception[^\n]++(\s+at .++)+ 它非常适用于查找堆栈跟踪。但是,我需要查找通过记录器输出的堆栈跟踪(在Bukkit Minecraft服务器中), 它们如下所示:
2012-08-10 08:19:17 [SEVERE] java.lang.NullPointerException
2012-08-10 08:19:17 [SEVERE] at net.minecraft.server.World.tickEntities(World.java:1146)
2012-08-10 08:19:17 [SEVERE] at net.minecraft.server.MinecraftServer.q(MinecraftServer.java:567)
2012-08-10 08:19:17 [SEVERE] at net.minecraft.server.DedicatedServer.q(DedicatedServer.java:212)
2012-08-10 08:19:17 [SEVERE] at net.minecraft.server.MinecraftServer.p(MinecraftServer.java:476)
2012-08-10 08:19:17 [SEVERE] at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:408)
2012-08-10 08:19:17 [SEVERE] at net.minecraft.server.ThreadServerApplication.run(SourceFile:539)

日期和时间会随时更改,但[SEVERE]始终存在。我想用正则表达式捕获这种异常格式。任何异常,不仅仅是NPE。
我真的不知道该怎么做。我查看了一些关于正则表达式的教程,但这些大型教程对我来说仍然是无意义的。这是我最近的尝试: ^.+Exception[^\n]++(.++at .++)+ 编辑: 好吧,我进行了更多的研究,有了一点进展。我制作了这个: \d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\s\[SEVERE\] 它可以匹配第一部分。但我在捕获整个跟踪方面遇到了一些问题。

1
似乎你不理解正则表达式。网络上有很多资源(可能有数万个)可以帮助你更好地理解它们。或者,从这里的Oracle教程开始:http://docs.oracle.com/javase/tutorial/essential/regex/ - Brian Roach
这里是另一个好的教程 - Jeffrey
2个回答

4

这对于您使用Logger的方法非常有用。默认情况下,堆栈跟踪会在堆栈跟踪的每一行前打印制表符。我的例子将开始行与日期和原始错误消息匹配,还包括异常错误和堆栈跟踪(如果有的话)。

((?:[a-zA-Z]{3} \d{1,2}, \d{4,4} \d{1,2}:\d{2}:\d{2} (AM|PM) (\(INFO\)|\(SEVERE\)|\(WARNING\))).*\r(?:(.*Exception.*(\r.*)(\tat.*\r)+)))|((?:[a-zA-Z]{3} \d{1,2}, \d{4,4} \d{1,2}:\d{2}:\d{2} (AM|PM) (\(INFO\)|\(SEVERE\)|\(WARNING\))).*)

以下任何一项都是匹配的:

Feb 08, 2014 5:18:00 PM (SEVERE) Thread: 13 [com.datarefresh.refresh.RefreshActionQueuePersister.write] Could not write RefreshActionQueue checkpoint due to error
Feb 09, 2014 1:00:10 AM (INFO) Thread: 14 [com.datarefresh.refresh.RefreshWorker.doPostProcess] (DATA_INSIGHT_DATA_REFRESH.15) Post-processing...
Feb 09, 2014 1:00:20 AM (SEVERE) Thread: 14 [com.datarefresh.refresh.RefreshActionQueuePersister.write] Could not write RefreshActionQueue checkpoint due to error
java.lang.RuntimeException: Could not delete RefreshActionQueue checkpoint file
    at com.datarefresh.refresh.RefreshActionQueuePersister.delete(RefreshActionQueuePersister.java:71)
    at com.datarefresh.refresh.RefreshActionQueuePersister.write(RefreshActionQueuePersister.java:53)
    at com.refresh.RefreshActionQueue.persist(RefreshActionQueue.java:94)
    at com.refresh.RefreshActionQueue.removeCurrentAction(RefreshActionQueue.java:48)
    at com.refresh.RefreshWorker.doPostProcess(RefreshWorker.java:304)
    at com.refresh.RefreshWorker.doActions(RefreshWorker.java:82)
    at com.refresh.RefreshWorker.call(RefreshWorker.java:57)
    at com.datarefresh.refresh.RefreshWorker.call(RefreshWorker.java:28)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Feb 09, 2014 1:00:20 AM (INFO) Thread: 14 [com.datarefresh.refresh.RefreshWorker.doPostProcess] (DATA_INSIGHT_DATA_REFRESH.16) Done post-processing.

实际上,我会从匹配中移除“INFO”。

3

我成功了,伙计们!

^.+Exception[^\n]++(\s\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} \[SEVERE\] at .++)+

当您编译时,只需打开DOTALL即可。


这仅适用于您选择报告日志的方法。很好的基础知识,让您学习正则表达式。 - Signus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接