Como você formatar uma exceção no slf4j?

Yeikel:

De muitos exemplos que eu encontrei on-line, a documentação e aqui no estouro de pilha , o caminho certo para cordas concatenar em slf4j é usar o built-in seqüência de formatação.

Por exemplo :

    LOGGER.error("ExceptionHandler throws {}" , appException);

Eu também tentei sem formatação e produziu o mesmo resultado:

    LOGGER.error("ExceptionHandler throws " , appException);

Por alguma razão, que não está funcionando para mim e eu não sei o que estou ausente. Usamos um formato diferente, se passar um objeto?

Os exemplos acima são imprimindo a seguinte mensagem de registo:

2018-07-18 02:38:19 ERROR c.a.c.c.p.ExceptionProcessor:67 - ExceptionHandler throws  {}

Em vez da mensagem esperado que eu recebo quando eu uso concatenação normal:

LOGGER.error("ExceptionHandler throws " + appException);

Ou quando eu manualmente chamar .toString ()

   LOGGER.error("ExceptionHandler throws {}" , appException.toString());

De acordo com Sonar, esta última opção não é porque correto:

Porque seqüências de formato de estilo printf são interpretados em tempo de execução, em vez de validados pelo compilador, que pode conter erros que resultam nas cordas erradas sendo criado. Esta regra estaticamente valida a correlação de seqüências de formato de estilo printf para os seus argumentos ao chamar o formato (...) métodos de java.util.Formatter, java.lang.String, java.io.PrintStream, MessageFormat e java.io aulas .PrintWriter e do printf (...) métodos de classes java.io.PrintStream ou java.io.PrintWriter.

A classe AppException é o seguinte:

import java.io.Serializable;

import javax.ws.rs.core.Response.Status;


public class AppException extends Exception implements Serializable {

    private static final long serialVersionUID = 1L;

    private Error error;
    private Status status;

    public AppException(Error error, Status status) {
        this.error = error;
        this.status = status;
    }

    public AppException() {
    }

    public Error getError() {
        return error;
    }

    public void setError(Error error) {
        this.error = error;
    }

    public Status getStatus() {
        return status;
    }

    public void setStatus(Status status) {
        this.status = status;
    }

    @Override
    public String toString() {
        return "AppException [error=" + error + ", status=" + status + "]";
    }

}

Estou construindo meu logger como segue:

private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionProcessor.class);

E estou usando slf4j-api 1.7.22

Andreas:

Você acredita que LOGGER.error("ExceptionHandler throws {}" , appException);está chamando:

error(String format, Object arg)

mas é, na verdade, chamando:

error(String msg, Throwable t)

porque é um ajuste melhor para os tipos de argumentos.

Se você quer que ele ligue para o primeiro, lançar o argumento para Object:

LOGGER.error("ExceptionHandler throws {}" , (Object) appException);

ou chamada toString()como você já tentou.

Se você tivesse usado uma boa IDE para escrever seu código, o IDE teria ajudado a descobrir isso. Por exemplo, no Eclipse, se você passar o mouse sobre a chamada de método, ele vai mostrar exatamente qual método está sendo chamado. Muito útil quando há sobrecargas no lugar.


Eu apenas reconstruiu o código, e acrescentou duas entradas de log: um com uma chamada para toString e outra com o elenco que você está propondo. Aquele com o elenco não está funcionando como esperado e está produzindo o resultado que eu postei inicialmente (sem mensagem)

Incapazes de se reproduzir. Aqui está MCVE (usando org.slf4j:slf4j-simple:1.7.25):

Logger logger = LoggerFactory.getLogger("Test");
Exception e = new Exception("Test");

logger.error("Test 1: {}", e);           // calls error(String, Throwable)
logger.error("Test 2: {}", (Object) e);  // calls error(String, Object)

Resultado

[main] ERROR Test - Test 1: {}
java.lang.Exception: Test
    at Test.main(Test.java:8)
[main] ERROR Test - Test 2: java.lang.Exception: Test

First Call impressões mensagem como está (com {}) eo stacktrace.
Mensagem de chamada de impressão em segundo lugar com {}substituído pelo texto de exceção.

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=203152&siteId=1
Recomendado
Clasificación