2

ログファイルを解析してスタックトレースを見つけるための正規表現を取得した次の正規表現があります

^.+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\] これは最初の部分と一致します。ただし、トレース全体をキャプチャするのに問題があります。

4

2 に答える 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 を削除します。

于 2014-02-14T22:53:19.000 に答える
3

やったぜ諸君!

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

コンパイル時に DOTALL を有効にするだけです。

于 2013-07-03T02:07:58.450 に答える