如何让Spring输出与预设级别不同的日志?
解决方案:调整CommonsRequestLoggingFilter的日志输出级别
方案一:自定义Filter子类(最直接)
CommonsRequestLoggingFilter的日志级别确实硬编码在logMessage方法里,但这个方法是protected的,直接子类重写就能解决问题,不用碰复杂的日志拦截逻辑:
import org.springframework.web.filter.CommonsRequestLoggingFilter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class InfoLevelRequestLoggingFilter extends CommonsRequestLoggingFilter { private static final Logger logger = LoggerFactory.getLogger(InfoLevelRequestLoggingFilter.class); @Override protected void logMessage(String message) { // 将原有的DEBUG级别输出改为INFO logger.info(message); } }
接着在Spring配置里替换默认过滤器:
@Configuration public class WebConfig { @Bean public CommonsRequestLoggingFilter requestLoggingFilter() { InfoLevelRequestLoggingFilter filter = new InfoLevelRequestLoggingFilter(); // 保留你原本的请求日志配置,比如是否记录请求体、请求头等 filter.setIncludeQueryString(true); filter.setIncludePayload(true); filter.setMaxPayloadLength(10000); filter.setIncludeHeaders(true); filter.setAfterMessagePrefix("REQUEST DATA : "); return filter; } }
方案二:用日志框架拦截修改级别(适合不想改动Filter的场景)
如果不想自定义Filter,可以借助日志框架的扩展功能实现。以Logback为例,添加TurboFilter拦截指定Logger的DEBUG日志,强制转为INFO级别输出:
在logback.xml中添加配置:
<turboFilter class="ch.qos.logback.classic.turbo.MatchingFilter"> <logger>org.springframework.web.filter.CommonsRequestLoggingFilter</logger> <level>DEBUG</level> <onMatch>ACCEPT_WITH_INFO</onMatch> </turboFilter>
这个过滤器会匹配目标Logger的DEBUG日志,修改级别为INFO后再输出。
补充说明
不用纠结Spring硬编码的问题,上面两种方法都能快速实现需求:方案一更轻量,直接针对Filter本身调整;方案二是从全局日志层面修改,可根据你的实际场景选择。
内容的提问来源于stack exchange,提问作者peer
相关产品推荐
相关产品推荐

