2016-12-23 3 views
0

私が持っているすべてのユニークなエラーを個別に記録したいのですが、十数個のログファイルを検索すると、それぞれ+ 10k行が時間を浪費し、面倒です。コンソールに出力されているすべてのスタックトレースの内容を取得しますか?

私は可能な限りすべての例外をキャッチしますが、多くの場合、他のスレッドやライブラリは自分で処理することなく独自のエラーを発生させることがあります。

これに対応する方法はありますか?

(例えばprintStackTrace()が呼び出されたときのイベント。)思考のための

+0

log4jを使用している場合は、興味のないパッケージに対して異なるログレベルを指定することができます。 – oschlueter

+0

いいえ、私はスローされたすべての例外の内容を取得できる必要があります。 – noiber475

答えて

0

によってオーバーマッピングは、このための任意の回避策があることを好むべきで一度だけの例外を保存確保するためのより良い方法を可能にした場合は? (例えばときのprintStackTrace()のイベントが呼び出される。)

Remap System.errスロー可能オブジェクトを遮断します。あなたはThrowable.printStackTrace()のソースコードを見れば、あなたはそれが間接的に呼び出すことがわかりますSystem.err.println(this);例えば

import java.io.PrintStream; 

public class SpyPrintStream extends PrintStream { 

    public static void main(String[] args) { 
     System.setErr(new SpyPrintStream(System.err)); 
     System.setOut(new SpyPrintStream(System.out)); 
     new Exception().printStackTrace(); 
    } 

    public SpyPrintStream(PrintStream src) { 
     super(src); 
    } 

    @Override 
    public void println(Object x) { 
     if (x instanceof Throwable) { 
      super.println("Our spies detected "+ x.getClass().getName()); 
     } 
     super.println(x); 
    } 
} 

覚えておいてそこに問題のすべての種類は、このコードを使用してあり、それが起こっていませんprintStackTraceが標準ストリームではないストリームで呼び出された場合に機能します。

本当にすべての例外をトラップする場合は、java.lang.instrumentに深呼吸することができます。

私は可能な限りすべての例外をキャッチしますが、多くの場合、他のスレッドやライブラリは自分で処理することなく独自のエラーを発生させることがあります。

ほとんどのライブラリは、呼び出し元に例外を戻すか、ログフレームワークを使用します。例外をキャプチャするか、ログフレームワークを構成します。

私が持っているすべてのユニークなエラーを個別にログに記録したいのですが、長さが+ 10k行のダースのログファイルを検索すると時間が浪費し面倒です。

ロギングフレームワークには、これに対処するオプションがあります。 DuplicateMessageFilterがその例です。

0

食べ物:

public class DemoClass { 

    private Map<String, Exception> myExceptions = new HashMap<>(); 

    public void demoMethod() { 
     try { 
      // throwing an exception for illustration 
      throw new IOException("some message"); 
     } catch (IOException e) { 
      myExceptions.putIfAbsent(e.getLocalizedMessage(), e); 

      // actually handle the exception 
      ... 
     } 
    } 

    public void finished() { 
     for (Exception e : myExceptions.values()) { 
      e.printStackTrace(); 
     } 
    } 
} 

あなたはまだ見ていない任意の例外を格納することができます。あなたの具体的なシナリオは、あなただけがException.getLocalizedMessage()

関連する問題