2013-07-03 11 views
0

匹配異常堆棧跟蹤我有我獲得Regular expression to parse a log file and find stacktracesJava的正則表達式從記錄儀

^.+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。

我真的不知道如何去做這件事。我檢查了一些關於正則表達式的教程,但這些大個子對我來說仍然是一些胡言亂語。這是我最近嘗試

​​

編輯: 好吧,我做了一些調查研究,並得到了遠一點。我做了這個: \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/ –

+0

這裏是[另一個很好的教程](http://www.regular-expressions.info/tutorial.html )。 – Jeffrey

回答

2

我做到了!

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

您只需在編譯它時打開DOTALL。

+0

這隻與您選擇報告日誌的方法一致。但是,爲您學習正則表達式的好的入門書。 – Signus

2

這對使用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. 

在現實中,我會從匹配刪除信息。