Spring Data MongoDB出现重复查询日志 如何屏蔽指定方法的日志输出
核心结论
首先明确:Logback、Log4j2等主流Java日志框架的日志级别控制粒度仅到类或包层级,不支持直接为同一个类下的单个方法单独配置日志级别,因此无法通过原生的日志级别配置直接屏蔽MongoTemplate中单个方法的打印内容。
重复日志解决方案
方案一:使用日志过滤器实现内容过滤(推荐)
通过日志框架自带的过滤规则,匹配到不需要的日志内容后直接拦截输出,改造成本最低。
以Spring Boot默认集成的Logback框架为例,在logback-spring.xml中新增如下过滤器配置即可,示例为拦截包含in db.collection:的第二条日志:
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <!-- 原有appender配置保持不变 --> <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator> <expression>logger == "org.springframework.data.mongodb.core.MongoTemplate" && message.contains("in db.collection:")</expression> </evaluator> <OnMatch>DENY</OnMatch> <OnMismatch>NEUTRAL</OnMismatch> </filter> </appender>
如果你使用的是Log4j2,可通过RegexFilter实现相同的匹配拦截逻辑,匹配规则可根据你要保留的日志内容灵活调整。
方案二:自定义Mongo操作日志
将MongoTemplate的日志级别调整为INFO,关闭框架默认的查询日志,改为在自己的业务DAO层自行打印Mongo操作日志:
- 修改
application.yml配置:
logging: level: org.springframework.data.mongodb.core.MongoTemplate: INFO
- 在DAO层的查询方法前后自行打印需要的DEBUG日志,完全自主控制日志格式和内容,从根源上避免重复日志问题。
方案三:重写MongoTemplate逻辑(不推荐)
如果必须保留框架原生的日志输出,也可以继承MongoTemplate重写doFindOne方法,或者通过BeanPostProcessor替换内部的FindOneCallback实现,删除不需要的日志打印逻辑,但该方案后续升级Spring Data MongoDB版本时需要重新适配,维护成本较高。
内容的提问来源于stack exchange,提问作者Victor Levin
相关产品推荐
相关产品推荐

