如何配置Spring MVC避免异常日志输出到JBoss的server.log?
解决方案
问题根源
你看到的server.log中的日志是Undertow服务器请求处理组件输出的,并非Spring MVC直接输出。当控制器抛出的异常未被Spring完全处理时,Undertow的请求处理器会捕获该异常并记录到server.log,而非应用指定的日志文件。
解决步骤
1. 通过Spring全局异常处理器捕获所有控制器异常
使用Spring的@ControllerAdvice实现全局异常处理,确保控制器抛出的异常被Spring完全处理,避免Undertow捕获并记录到server.log。
创建全局异常处理器类:
import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.servlet.ModelAndView; import javax.naming.NameNotFoundException; @ControllerAdvice public class GlobalExceptionHandler { // 处理JNDI查找异常 @ExceptionHandler(NameNotFoundException.class) public ModelAndView handleJndiLookupError(Exception ex) { ModelAndView mv = new ModelAndView("errorPage"); mv.addObject("exception", ex); // 使用Log4J 1.2 API记录异常,会自动应用你的日志配置 org.apache.log4j.Logger.getLogger(this.getClass()).error("JNDI数据源查找失败", ex); return mv; } // 处理所有未捕获的异常 @ExceptionHandler(Throwable.class) public ModelAndView handleAllUncaughtErrors(Exception ex) { ModelAndView mv = new ModelAndView("errorPage"); mv.addObject("exception", ex); org.apache.log4j.Logger.getLogger(this.getClass()).error("未处理的系统异常", ex); return mv; } }
2. 调整WildFly/JBoss日志配置(可选)
如果仍希望Undertow的请求异常记录到应用日志文件而非server.log,可以在你的MyLoggingProfile中配置io.undertow.request日志类别,将其绑定到应用日志的文件处理器:
在服务器的配置文件(如standalone.xml)中找到MyLoggingProfile节点,添加以下配置:
<logger category="io.undertow.request"> <level name="ERROR"/> <handlers> <!-- 替换为你应用日志对应的处理器名称 --> <handler name="MY_APP_FILE_HANDLER"/> </handlers> </logger>
3. 验证配置生效
- 确保
META-INF/MANIFEST.MF中的Logging-Profile: MyLoggingProfile配置正确,应用部署时已加载指定的日志配置。 - 重新部署应用后调用
/callKO,检查异常是否只出现在应用日志文件中,server.log不再输出该异常。
内容的提问来源于stack exchange,提问作者andynaz
相关产品推荐
相关产品推荐

