2012-12-14 11 views
5

Ich verwende Commons in einer Java-Anwendung anmelden, und ich möchte die Ausnahme von der Stack-Ablaufverfolgung protokollieren.Eine Ausnahme mit commons.logging in Java protokollieren?

catch(IOException exception) { 
    logger.error("IOException Occured :", exception.fillInStackTrace()); 

     //Print the entire stack trace to log file. 
     throw new AsExceptionUtl(APPMessageHelper.getMessage(APPMessageConstants.ERROR_FailedLoadFile, documentPath)); 
    } 

Ist das der richtige Weg? Und wird es den Stacktrace im Protokoll drucken?

Antwort

4

Wenn Sie die Ausnahme protokollieren wollen, dann benutzen Sie einfach

logger.error("IOException Occured :", exception); 

Ob der Stack-Trace angezeigt oder nicht, hängt davon ab, was die zugrunde liegende Logging-Implementierung ist, und wie es konfiguriert ist. AFAIK, die meisten oder alle Implementierungen zeigen standardmäßig die Stapelüberwachung der Ausnahmen an.

+0

+1 der Stack-Trace wird nach Bedarf ausgefüllt, und ich kann mir keinen guten Grund vorstellen, ihn explizit aufzurufen, es sei denn, Sie möchten die Stack-Trace ändern (was ich in einer meiner Bibliotheken gemacht habe, aber das macht es eine gute Idee in der Regel :) –

+0

@ peter-lawrey @ jb-nizet Also was wird 'exception.fillInStackTrace()' in meinem Fall tun. –

+2

Nichts, da der Konstruktor von Throwable bereits fillInStackTrace() aufruft. Der Stack-Trace ist standardmäßig vorhanden. Mach dir keine Sorgen darüber. –

2

Apache Commons Logging erklärt: Es gibt nicht viel Dokumentation über diese im Internet verfügbar. Dies ist ein kleiner Artikel zu Ihrem Vorteil:

Um Nachrichten in Ihrem Java-Code zu protokollieren, müssen Sie zwei Klassen in Ihren Quellcode importieren.

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 

nun Ihr Protokoll zu erstellen, ein Attribut in der Klasse in einem von zwei Arten erstellen:

private Log m_log = LogFactory.getLog(MyClass.class); 

oder

private Log m_log = LogFactory.getLog("MyClassLogger"); 

Die erste Option ist die Schaffung nur eine generische Logger für Ihre Klasse, die von den Standardprotokollierungsoptionen gesteuert wird. Die zweite Möglichkeit besteht darin, einen spezifischen Logger zu erstellen, den Sie "MyClassLogger" genannt haben und der einzeln auf die Standardwerte eingestellt werden kann. Möglicherweise möchten Sie das tun, wenn Sie anderen Quellcode von Dritt-Anbieter verwenden, der Protokollierung verwendet, aber Sie möchten die Debugs oder andere Information von dem Quellcode nicht anzeigen. Die Verwendung des Loggers ist ziemlich einfach. Sie können Protokollmeldungen senden, indem Sie eine der Priorität entsprechende Methode aufrufen:

m_log.fatal(Object message); 
m_log.fatal(Object message, Throwable t); 
m_log.error(Object message); 
m_log.error(Object message, Throwable t); 
m_log.warn(Object message); 
m_log.warn(Object message, Throwable t); 
m_log.info(Object message); 
m_log.info(Object message, Throwable t); 
m_log.debug(Object message); 
m_log.debug(Object message, Throwable t); 
m_log.trace(Object message); 
m_log.trace(Object message, Throwable t); 

Diese Methoden werden in der Reihenfolge der Priorität von der höchsten zur niedrigsten aufgelistet. Die Commons-Protokollierung ist standardmäßig so eingestellt, dass alle Nachrichten von INFO und höher angezeigt werden. Wie Sie sehen können, ist jede Methode mit einer Methode überladen, bei der Sie einen Throwable-Typ, z. B. eine Exception, senden können - sehr praktisch! Das ist alles, was Sie tun müssen, um die Nachrichten zu protokollieren.

In Ihrem Fall müssen Sie nur verwenden:

logger.error("IOException Occured :", exception); 

Es besteht keine Notwendigkeit stacktrace als das Ausnahmeobjekt hier zu nennen geworfen mit Ausnahme protokolliert werden.

+0

Das Protokollieren einer Ausnahme auf diese Weise protokolliert nicht unbedingt den Stack-Trace der Ausnahme, sondern kann die Nachricht einfach in das Protokoll schreiben, z. "IOException Occured: Socket geschlossen" und das ist alles, was Sie bekommen. –