如何彻底禁用slf4j logger输出的debug级别日志消息
问题根源
你当前的配置存在两个直接问题:
- 重复定义了两个
<root>根日志节点,Logback加载配置时后定义的节点会覆盖前者,你写的空的debug级别root节点,会在部分运行场景(比如构建执行测试阶段)覆盖之前的info级别配置,导致全局日志级别被放开到debug。 - 没有对第三方依赖做单独的日志级别限制,全局级别一旦放开到debug,所有第三方包的debug日志会全部输出到控制台。
修复方案
- 首先删除配置中多余的空
<root level="debug"></root>节点,避免配置覆盖问题。 - 调整日志级别规则:全局默认日志级别设为
INFO,如果你的业务代码需要输出debug日志,单独给你自己项目的根包配置debug级别即可,所有未单独配置的第三方依赖会默认继承全局的INFO级别,不会输出debug日志。 - 对于个别输出日志极多的第三方依赖,可以单独指定更高的日志阈值(比如WARN/ERROR),彻底屏蔽无关输出。
修复后的完整logback.xml配置参考:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} %boldCyan(%-34.-34thread) %red(%10.10X{jda.shard}) %boldGreen(%-15.-15logger{0}) %highlight(%-6level) %msg%n</pattern> </encoder> </appender> <!-- 如需自己的业务代码输出debug日志,替换为你项目的实际根包名即可;不需要的话可以删掉这段logger配置 --> <logger name="替换为你的项目根包名,例如com.yourname.app" level="DEBUG" additivity="false"> <appender-ref ref="STDOUT" /> </logger> <!-- 全局默认日志级别设为INFO,所有第三方依赖默认不会输出DEBUG及以下级别日志 --> <root level="INFO"> <appender-ref ref="STDOUT" /> </root> <!-- 按需添加单独的第三方包屏蔽规则,name值填控制台输出的对应日志的logger包名即可,示例如下 --> <!-- <logger name="org.apache" level="WARN"/> <logger name="io.netty" level="WARN"/> <logger name="net.dv8tion.jda" level="INFO"/> --> </configuration>
额外注意事项
- 如果日志是在执行项目构建的单元测试阶段输出的,检查
src/test/resources目录下是否存在独立的logback配置文件,测试运行时会优先加载测试资源目录下的配置,需要同步修改上述规则。 - 如果改完配置仍有零散的第三方debug日志,直接复制控制台对应日志开头的logger名,添加上述单独的logger配置,把级别设为INFO即可精准屏蔽。
内容的提问来源于stack exchange,提问作者Schorschii
相关产品推荐
相关产品推荐

