2010-09-15 4 views
12

Ich war eine Ausnahme zu kontrollieren und zu versuchen, den Stack-Trace in die Protokolle wie folgt zu schreiben:Wie schreibt man eine vollständige Stack-Trace in das Protokoll?

log.warn(e.getMessage()); 

Aber alle sagten, es

null 

So war ich änderte es zu

log.warn(e.toString()); 

Und jetzt sagt es nur

java.lang.NullPointerException 

Wie schreibe ich die vollständige Stack-Ablaufverfolgung in das Protokoll, damit ich sehen kann, wo diese Ausnahme in der App generiert wird?

Antwort

28

Regel:

log.warn("message", e); 

Aber es hängt davon ab, zu Ihrem Logging-Framework.

3

In Ihrer Ausnahme Methode, die zugrunde liegenden String, der die Nachricht enthält, ist null.

Die oben genannte Antwort, jetzt schlug, hält nach wie vor, mit der Ausnahme, dass e nicht null, aber die detailMessage private Instanz Variable auf der Throwable Klasse ist null, weshalb e.getMessage() der String null, aber e.toString() (welche Anrufe zugrunde liegende NulldetailMessage.toString) wirft eine NullPointerException.

+1

wenn e null war, log. warnen (e.getMessage()); würde eine Ausnahme auslösen und würde nicht "null" ausgeben. –

+0

Nein würde es nicht, es würde eine NPE werfen –

+0

Entschuldigung, ich habe Ihren Kommentar falsch gelesen –

1

diese Verwendung von log4j mit getan wird Das erste Argument ist eine anzuzeigende Nachricht, das zweite ist die Ausnahme (throwable), deren Stacktrace protokolliert wird.

Eine weitere Option ist commons-logging, wo es ist das gleiche:

log.error ("Message", Ausnahme);

logger.log (Level:

dies mit java.util.logging über erfolgen.SEVERE, "Nachricht", Ausnahme);

1

Wenn Sie java8 verwenden Sie folgendes tun können:

 LOGGER.error("Caught exception while methodX. Please investigate: " 
       + exception 
       + Arrays.asList(exception.getStackTrace()) 
       .stream() 
       .map(Objects::toString) 
       .collect(Collectors.joining("\n")) 
     ); 
+0

Es funktioniert ganz gut und es ist auch nützlich während der Debugging-Sitzungen, wenn Ausnahmen nicht ordnungsgemäß protokolliert werden. – alexandrul

0

Wenn Sie eine Java-Version vor 8 verwenden, können Sie dies versuchen:

  LOGGER.error("Error al recuperar proveedores de la base de datos: " + 
      e + Arrays.asList(e.getStackTrace()).stream().map(new Function(){ 
        @Override 
        public Object apply(Object t) { 
         return t.toString(); 
        } 
       }).collect(Collectors.joining("\n"))); 
Verwandte Themen