我正在尝试配置Spring和Log4j2来记录带有堆栈跟踪到文件的异常。问题是默认配置只记录一行,例如:
2016-11-21 23:14:28 WARN MvcLogger:189 - Resolved exception caused by Handler execution: java.lang.Exception: some message
此行由SimpleMappingExceptionResolver打印,如下所示:
@Bean
public SimpleMappingExceptionResolver createSimpleMappingExceptionResolver(){
SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
Properties mappings = new Properties();
mappings.setProperty("Exception", "exception");
resolver.setExceptionMappings(mappings);
resolver.setDefaultErrorView("error");
resolver.setWarnLogCategory("example.MvcLogger");
return resolver;
}
所以我查看了SimpleHappingExceptionResolver超类的AbstractHandlerExceptionResolver的源代码,我发现了这个:
protected void logException(Exception ex, HttpServletRequest request) {
if (this.warnLogger != null && this.warnLogger.isWarnEnabled()) {
this.warnLogger.warn(buildLogMessage(ex, request));
}
}
我意识到它无法在异常下打印堆栈跟踪。要解决此问题,我必须扩展SimpleMappingExceptionResolver并覆盖logException方法,但实际上没有更简单的方法来执行此操作吗?
这是我的log4j2.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<File name="File" fileName="${sys:catalina.home}/logs/money-manager/appLog.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
</File>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %m%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="INFO">
<appenderRef ref="File"/>
</Root>
<Logger name="com.corriel" level="DEBUG" additivity="true">
<appender-ref ref="File" level="DEBUG" />
</Logger>
<Logger name="org.hibernate.SQL" level="DEBUG">
<AppenderRef ref="Console"/>
</Logger>
<Logger name="org.hibernate.type" level="TRACE">
<AppenderRef ref="Console"/>
</Logger>
</Loggers>
</Configuration>