当前位置: 首页 > 知识库问答 >
问题:

如何在SLF4J中格式化异常?

慎建本
2023-03-14

从我在网上找到的许多例子、文档和Stack overflow中找到的例子来看,在slf4j中连接字符串的正确方法是使用内置的字符串格式。

例如:

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

我也尝试了不设置格式,结果也是一样的:

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

出于某种原因,这对我不起作用,我不知道我错过了什么。如果我们传递一个对象,是否使用不同的格式?

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

而不是使用常规级联时得到的预期消息:

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

或者手动调用.toString()

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

根据声纳的说法,这最后一个选项是不正确的,因为:

由于printf样式的格式字符串是在运行时解释的,而不是由编译器验证的,因此它们可能包含导致创建错误字符串的错误。此规则在调用格式(...)时静态验证printf样式的格式字符串与其参数的相关性java.util.Formatter、java.lang.String、java.io.PrintStream、MessageFormat和java.io.PrintWriter类的方法以及printf(...)java.io.PrintStream或java.io.PrintWriter类的方法。

AppException类如下:

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 + "]";
    }

}

我正在按照以下方式构建日志程序

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

我正在使用SLF4J-API 1.7.22

共有1个答案

谯振国
2023-03-14

您相信Logger.Error(“ExceptionHandler throws{}”,appException);正在调用:

错误(字符串格式,对象参数)

但它实际上是在召唤:

错误(字符串消息,可抛出t)

因为这更适合参数类型。

如果希望它调用第一个,请将参数强制转换为object:

LOGGER.error("ExceptionHandler throws {}" , (Object) appException);
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)

输出

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

第一个调用按原样打印消息(使用{})和StackTrace。
第二个调用打印消息,使用异常文本替换{}

 类似资料:
  • 我正在使用的url-String newfullurl=“https://myappnametest.herokuapp.com/predict?{”+“”arr“”+“:[114.4756,31.57832,4.698017,1.834955,1.433942,1.388775,6.730856,12.19739,7.460399,4.807888,115.51131,69.19083,504.

  • 我看过很多关于SO的类似问题,但没有一个回答我的问题。 我有一个文件,内容如下: 我想重新格式化php或html代码,无论是全局还是选择。 我已经尝试了所有的选项,但它不起作用。 CtrlShiftp, 如果我更改了,然后它就可以工作了。

  • 点击按钮后,我尝试在< code>Text小部件中显示当前的< code>DateTime。下面的作品,但我想改变格式。 目前的做法 结果 问题 如何删除部分?

  • 问题内容: 我正在尝试从标准ISO 8601 格式更改为好的MMM d yyyy hh:mm z格式,但是我当前的代码失败。 我正在从api接收时间和日期。 问题答案: A 是“ ISO-8601日历系统中没有时区的日期,例如2007-12-03”,因此那里没有足够的信息。使用代替。 同样,吞噬这样的异常会使得排除故障变得更加困难。当您不打算处理异常时,要么根本不捕获它,要么捕获并重新包装在Run

  • 问题内容: 我正在尝试使用jena库为语义Web编写Java Web搜寻器。我有使用Netbeans构建项目。我收到两个错误: 无法实例化SLF4J LoggerFactory报告的异常:java.lang.NoClassDefFoundError:org / apache / log4j / Level 无法在org.slf4j.LoggerFactory.bind(LoggerFactory.

  • 我正在尝试使用jena库为语义网编写java web爬虫程序。我已经使用Netbeans构建了一个项目。我收到两个错误: > 未能实例化SLF4J LoggerFactory报告的异常:java。lang.NoClassDefFoundError:org/apache/log4j/Level 无法初始化类com。惠普。hpl。耶拿。rdf。模型impl。modelorg。slf4j。伐木厂。绑定(