AEM 6.4升级至6.5后单元测试日志级别变为DEBUG问题咨询
日志级别控制逻辑
SLF4J为日志抽象层,本身不控制日志级别,实际生效级别由运行时加载的日志实现框架的配置决定:
- 你现有项目中运行时加载的是AEM 6.5 uber-jar内置的
ch.qos.logback.classic日志实现,Logback默认无配置文件时的全局日志级别为DEBUG,因此会输出所有DEBUG及以上级别的日志,包含Sling Mock适配器注册的相关调试日志。 - 官方Archetype生成的新项目中运行时加载的是
uk.org.lidalia.slf4jtest.TestLoggerFactory测试日志实现,该实现默认全局日志级别为INFO,因此不会输出DEBUG级别的日志。
更换uber-jar导致日志级别变化的原因
AEM 6.4版本的uber-jar未内置Logback实现类,单元测试运行时会加载项目测试依赖引入的SLF4J测试绑定,默认使用INFO级别输出。
而AEM 6.5的uber-jar为全量封装的Fat Jar,直接将Logback实现类打包进Jar内部,不属于Maven传递依赖,无法通过exclusions标签排除:
类加载阶段会优先加载uber-jar内置的Logback实现,若你的测试类路径下未指定Logback配置文件,就会触发默认DEBUG级别输出,产生大量调试日志。
可行的解决方案
- 调整Maven依赖顺序:在pom.xml中将测试用SLF4J绑定的依赖声明放在uber-jar依赖的上方,Maven会按依赖声明顺序优先加载靠前的绑定,覆盖uber-jar内置的Logback实现。
- 新增Logback测试配置:如果仍加载到Logback实现,在
src/test/resources目录下新增logback-test.xml配置文件,按需指定日志级别即可,配置示例如下:
<configuration> <!-- 单独关闭Sling Mock相关DEBUG日志 --> <logger name="org.apache.sling.testing.mock.sling" level="INFO" /> <root level="INFO"> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> </root> </configuration>
内容的提问来源于stack exchange,提问作者toniedzwiedz
相关产品推荐
相关产品推荐

