Skip to content

日志记录 (Logging)

Spring MVC 的日志设计旨在简洁、直观且对开发者友好。它在不同级别提供了不同深度的信息。

日志级别

  • DEBUG 级别:设计理念是“紧凑且人性化”。它只关注那些具有高复用价值的信息,避免在调试特定问题之外产生过多的干扰信息。
  • TRACE 级别:遵循与 DEBUG 类似的原则,但可以作为“消防栓”式的信息源,打印每一处细节。TRACE 级别下的日志消息可能会展示比 DEBUG 更详细的数据结构。

敏感信息保护

出于安全考虑,DEBUGTRACE 级别可能会记录敏感信息。因此,Spring MVC 默认会遮掩(Mask)请求参数和 Header。

如果你在开发环境下确实需要查看完整的请求细节,可以通过设置 DispatcherServletenableLoggingRequestDetails 属性来开启:

java
public class MyInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected void customizeRegistration(ServletRegistration.Dynamic registration) {
        // 开启请求详情日志(包括参数和 Header)
        registration.setInitParameter("enableLoggingRequestDetails", "true");
    }
}
kotlin
class MyInitializer : AbstractAnnotationConfigDispatcherServletInitializer() {
    override fun customizeRegistration(registration: ServletRegistration.Dynamic) {
        registration.setInitParameter("enableLoggingRequestDetails", "true")
    }
}

补充教学

1. Spring MVC 日志的最佳实践

在生产环境中,建议将 org.springframework.web 的级别设为 INFO,只有在预发布或本地开发时才开启 DEBUG。 过多的 DEBUG 日志不仅会消耗磁盘空间,还可能通过日志文件泄露用户的 Token 或隐私数据。

2. Spring Boot 中的快速设置

如果你使用的是 Spring Boot,可以通过配置文件轻松开启这些细节:

properties
# 开启 Web 层详情日志
spring.mvc.log-request-details=true
# 设置日志级别
logging.level.org.springframework.web=DEBUG

3. 如何追踪请求链路?(MDC)

虽然 Spring MVC 提供了请求日志,但在分布式环境下,你通常需要一个 TraceID推荐方案:结合 HandlerInterceptor,在 preHandle 中生成一个唯一 ID 并放入 MDC (Mapped Diagnostic Context) 中。

java
MDC.put("traceId", UUID.randomUUID().toString());

这样,你的所有日志输出都会带上这个 ID,排查链路问题时效率会提升数倍。

Based on Spring Framework.