Spring Boot如何禁用System.err的额外异常日志输出
解决Tomcat额外输出异常日志的问题
你遇到的额外错误日志并非Log4j2输出,而是Tomcat的StandardWrapperValve组件在处理未捕获异常时,直接通过System.err打印的容器级日志,和应用的Log4j2配置无关。以下是几种可行的解决方法:
方法1:直接禁用Tomcat该组件的日志输出
针对Spring Boot嵌入式Tomcat
在application.properties中添加配置:
# 完全关闭StandardWrapperValve的日志输出 logging.level.org.apache.catalina.core.StandardWrapperValve=OFF
若使用YAML格式(application.yml):
logging: level: org.apache.catalina.core.StandardWrapperValve: OFF
针对独立部署的Tomcat
修改Tomcat安装目录下conf/logging.properties文件,调整对应配置项:
# 将该组件日志级别设为OFF,停止输出 org.apache.catalina.core.StandardWrapperValve.level = OFF
方法2:全局捕获未处理异常
通过自定义全局异常处理器,拦截所有未处理的异常,避免Tomcat触发默认的错误日志输出。以Spring Boot项目为例:
import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public void handleAllExceptions(Exception ex, HttpServletResponse response) throws IOException { // 用Log4j2记录异常(已为JSON格式) // 返回自定义错误响应,阻止Tomcat输出额外日志 response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "服务器内部错误"); } }
方法3:重定向System.err到Log4j2(可选)
如果希望将System.err的输出也转为JSON格式,可在应用启动时重定向流:
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.io.IoBuilder; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import java.io.PrintStream; @SpringBootApplication public class Application { private static final Logger logger = LogManager.getLogger(Application.class); public static void main(String[] args) { // 重定向System.err到Log4j2,按ERROR级别输出 PrintStream log4jErr = IoBuilder.forLogger(logger) .setLevel(org.apache.logging.log4j.Level.ERROR) .buildPrintStream(); System.setErr(log4jErr); SpringApplication.run(Application.class, args); } }
内容的提问来源于stack exchange,提问作者D051P0
相关产品推荐
相关产品推荐

