如果我使用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配置。
答案 0 :(得分:1)
如果Spring Boot在类路径中找到名为log4j2.xml
或log4j2.json
或log4j2.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>