异常和记录器中的不同堆栈跟踪格式

时间:2019-05-21 10:03:29

标签: java spring-boot log4j2

如果我使用exception.printStackTrace()或使用logger.error(“ message”,exception),则异常的堆栈跟踪记录将以不同的方式打印。例如,我有例外:

public class TestException extends RuntimeException{

    private int status;

    public TestException(String message, int status) {
        super(message);
        this.status = status;
    }

    public TestException(String message, Throwable cause, int status) {
        super(message, cause);
        this.status = status;
    }

    @Override
    public String toString() {
        return super.toString() + ", status=" + status;
    }
}

如您所见,我已经重写了打印我的异常状态的toString方法。

在主方法中,我创建了两个TestException,一个是导致另一个的原因:

public static void main(String[] args) {
    TestException innerException = new TestException("some inner test", 1);
    TestException exception = new TestException("some text", innerException, 2);

    exception.printStackTrace();
    LOGGER.error(exception.toString(), exception);
}

运行此命令后, exception.printStackTrace()打印:

test.App$TestException: some text, status=2
    at test.App.main(App.java:66)
Caused by: test.App$TestException: some inner test, status=1
    at test.App.main(ErrorHandler.java:65)

如您所见,printStackTrace使用我的异常的toString方法并写入异常状态,但是LOGGER.error会在没有该异常的情况下进行打印:

    11:44:17.153 [main] ERROR test.App - test.App$TestException: some text, status=2
test.App$TestException: some text
    at test.App.main(App.java:66) [classes/:?]
Caused by: test.App$TestException: some inner test
    at test.App.main(App.java:65) ~[classes/:?]

如何在打印堆栈跟踪时将我的记录器配置为使用我的exception toString方法,与exception.printStackTrace()一样?

我使用的是log4j2,默认为Spring Boot 2.1.3配置。

1 个答案:

答案 0 :(得分:1)

如果Spring Boot在类路径中找到名为log4j2.xmllog4j2.jsonlog4j2.yaml的文件,它将自动配置Log4j。

您可以使用自己的模式配置文件。您可以在https://logging.apache.org/log4j/2.x/manual/layouts.html

中找到模式

这是一个示例log4j2.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
    <Properties>
        <Property name="LOG_PATTERN">
            %d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${hostName} --- [%15.15t] %-40.40c{1.} : %m%n%ex
        </Property>
    </Properties>
    <Appenders>
        <Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="com.example.log4j2demo" level="debug" additivity="false">
            <AppenderRef ref="ConsoleAppender" />
        </Logger>

        <Root level="info">
            <AppenderRef ref="ConsoleAppender" />
        </Root>
    </Loggers>
</Configuration>