2011-04-13 15 views
5

En mi clase de excepción personalizada hemos anulado toString():Invalidar Logback salida de error

@Override 
public String toString() { 
    final String msg = getLocalizedMessage(); 

    // base 
    String str = getClass().getName() + ": [" + code + "]"; 

    // message 
    if (msg != null) 
     str += " " + msg; 

    // extra 
    if (extra != null) { 
     str += '\n' + extra.toString(); 
    } 

    return str; 
} 

(sí, soy consciente de que debo usar StringBuilder allí)

Sin embargo, cuando registro tal excepción (a través de org.slf4j.Logger.warn(String msg, Throwable err)) la salida es la de vainilla excepciones:

webersg.util.service.ServiceError: null 
    at webersg.util.service.ServiceTools.decodeException(ServiceTools.java:39) ~[bin/:na] 
    at tr.silvercar.rummikub.robot.LobbyConnection.sendRequestTo(LobbyConnection.java:143) ~[bin/:na] 
    at tr.silvercar.rummikub.robot.LobbyConnection.sendRequest(LobbyConnection.java:98) ~[bin/:na] 
    at tr.silvercar.rummikub.robot.Robot.<init>(Robot.java:32) ~[bin/:na] 
    at tr.silvercar.rummikub.robot.RobotController.start(RobotController.java:81) ~[bin/:na] 
    at tr.silvercar.rummikub.robot.runners.LocalAltinRobot.main(LocalSilverRobot.java:132) [bin/:na] 

¿Cómo puedo conseguir que aparezcan mis datos adicionales? Mi implementación de registro es Logback.

Respuesta

3

Una manera rápida y sucia es esto: logger.warn ("your_message_here \ n {}", err.toString());

Una mejor manera sería escribir su propio indicador de conversión personalizada (consulte logback manual por lo que el manejo de error personalizado se abstrae de su código de aplicación, y se puede configurar su uso a través de una palabra conversión personalizada en su logback.xml.

Aquí está un ejemplo sencillo que va a hacer lo que está buscando:

package com.example.logging; 

import ch.qos.logback.classic.pattern.ClassicConverter; 
import ch.qos.logback.classic.spi.ILoggingEvent; 
import ch.qos.logback.classic.spi.IThrowableProxy; 
import ch.qos.logback.classic.spi.ThrowableProxy; 

/** 
* Simple exception converter. 
* 
*/ 
public class MyExceptionConverter extends ClassicConverter { 
    /* (non-Javadoc) 
    * @see ch.qos.logback.core.pattern.Converter#convert(java.lang.Object) 
    */ 
    @Override 
    public String convert(ILoggingEvent event) { 
     IThrowableProxy itp = event.getThrowableProxy(); 
     if (itp instanceof ThrowableProxy) { 
      ThrowableProxy tp = (ThrowableProxy)itp; 
      return tp.getThrowable().toString(); 
     } 

     return ""; 
    } 
} 

Luego, en su logback.xml tendrá que hacer referencia a ella como esto:

<conversionRule conversionWord="myCon" 
       converterClass="com.example.logging.MyExceptionConverter" /> 

y luego usar% MyCon en un patrón codificador de la siguiente manera:

<encoder> 
    <pattern>%d{dd MMM yyyy HH:mm:ss.SSS} %logger{0}: %myCon %nopex%n</pattern> 
</encoder> 

Tenga en cuenta que la adición de NOPEX% detiene el manejo

+2

Debe extenderse desde ThrowableHandlingConverter (en lugar de que se extiende desde ClassicConverter) excepción de costumbre. Entonces tampoco necesitas el hack% nopex. Y, en caso de que quiera imprimir el seguimiento de la pila,% myCon debería ir después de% n. –