2016-12-23 2 views
0

Ich möchte jeden eindeutigen Fehler, den ich habe, einzeln protokollieren, da die Suche nach einem Dutzend Protokolldateien jeweils + 10k Zeilen Länge ist Zeitverschwendung und langweilig.Inhalt aller Stapelspuren abrufen, die auf der Konsole gedruckt werden?

Ich fange alle Ausnahmen, die ich möglicherweise kann, aber oft andere Threads oder Bibliotheken schießen ihre eigenen Fehler ohne irgendeine Möglichkeit, sie selbst zu verarbeiten.

Gibt es eine Problemumgehung dafür?

(beispielsweise ein Ereignis für wenn printStackTrace() genannt wird.)

+0

Wenn Sie log4j verwenden, können Sie für die Pakete, die Sie nicht interessieren, unterschiedliche Protokollebenen angeben. Würde das funktionieren? – oschlueter

+0

Nein, ich muss den Inhalt aller Ausnahmen abrufen können. – noiber475

Antwort

0

über Mapping bevorzugen Gibt es eine Abhilfe für dieses? (beispielsweise ein Ereignis für wenn print() aufgerufen wird.)

Remap System.err zu Throwables abfangen. Wenn Sie Throwable.printStackTrace() auf den Quellcode schauen werden Sie sehen, dass es indirekt nennt System.err.println(this);

Zum Beispiel:

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); 
    } 
} 

Denken Sie daran, es gibt alle Arten von Problemen mit diesem Code und es wird nicht gehen in Fällen zu arbeiten, in denen printStackTrace mit Stream aufgerufen wird, der kein Standardstream ist.

Sie könnten immer tief tauchen in java.lang.instrument, wenn Sie wirklich alle Ausnahmen abfangen wollen.

Ich fange alle Ausnahmen, die ich möglicherweise kann, aber oft andere Threads oder Bibliotheken werden ihre eigenen Fehler schießen, ohne jede Möglichkeit, sie selbst zu verarbeiten.

Die meisten Bibliotheken senden Ausnahmen entweder an den Aufrufer zurück oder verwenden ein Protokollierungsframework. Erfassen Sie die Ausnahme oder konfigurieren Sie das Protokollierungsframework.

Ich mag jeden eindeutigen Fehler einzeln anmelden Ich habe, wie die Suche allerdings ein Dutzend lügt jeweils + 10k Zeilen-Dateien in der Länge der Zeit verschwenden und mühsam ist.

Logging-Frameworks enthalten Optionen, um damit umzugehen. DuplicateMessageFilter ist ein Beispiel.

0

zum Nachdenken:

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(); 
     } 
    } 
} 

Sie jede Ausnahme speichern könnten Sie noch nicht gesehen haben. Wenn Ihr spezielles Szenario für eine bessere Art und Weise ermöglicht, sicherzustellen, dass Sie nur eine Ausnahme speichern nur einmal sollten Sie, dass durch Exception.getLocalizedMessage()

Verwandte Themen