簡體   English   中英

Java正則表達式匹配記錄器中的異常堆棧跟蹤

[英]Java regular expression to match exception stack trace from logger

我有以下正則表達式,我獲得了正則表達式來解析日志文件並查找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\\]第一部分。 我在捕獲整個跟蹤時遇到了一些麻煩。

這非常適合您使用Logger的方法。 默認情況下,堆棧跟蹤的每一行都帶有選項卡打印出來。 我的示例將起始行與日期和原始錯誤消息以及Exception錯誤和堆棧跟蹤(如果它們存在)相匹配。

((?:[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。

我做到了!

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

編譯時只需要打開DOTALL。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM