Другой формат трассировки стека в исключении и регистраторе - PullRequest
1 голос
/ 21 мая 2019

Трассировка стека моего исключения выводится по-разному, если я использую exception.printStackTrace () или если я использую logger.error («message», исключение).Например, у меня есть исключение:

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/:?]

Как настроить мой регистратор на использование метода toString моих исключений при печати трассировки стека, так же как и для exception.printStackTrace ()?

Я использую log4j2, стандартная конфигурация весенней загрузки 2.1.3.

1 Ответ

1 голос
/ 21 мая 2019

Spring Boot автоматически настраивает Log4j, если он находит файл с именем log4j2.xml или log4j2.json или log4j2.yaml в пути к классам.

Вы можете настроить файл по собственному шаблону.Вы можете найти шаблоны здесь 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>
...