MyBatis SQL日志打印不出来?手把手教你排查Log4j2配置文件路径与优先级问题
MyBatis SQL日志打印失效全方位排查Log4j2配置疑难杂症刚接手一个遗留项目明明在pom.xml里引入了log4j2依赖MyBatis的SQL日志却像人间蒸发了一样。这场景是不是很熟悉别急着怀疑人生今天我们就用刑侦思维层层剥茧从配置文件加载机制到依赖冲突排查彻底解决这个让无数Java开发者夜不能寐的典型问题。1. 案件重演为什么我的SQL日志消失了上周在重构一个老项目时遇到了典型症状控制台能看到Spring启动日志但执行数据库操作时MyBatis的SQL语句完全沉默。先看下案发现场的基本情况!-- pom.xml片段 -- dependency groupIdorg.mybatis/groupId artifactIdmybatis/artifactId version3.5.6/version /dependency dependency groupIdorg.apache.logging.log4j/groupId artifactIdlog4j-core/artifactId version2.17.1/version /dependency项目里明明有log4j2.xml配置文件内容看起来也没问题?xml version1.0 encodingUTF-8? Configuration Appenders Console nameCONSOLE targetSYSTEM_OUT PatternLayout pattern%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n/ /Console /Appenders Loggers Root leveldebug AppenderRef refCONSOLE/ /Root /Loggers /Configuration注意很多开发者会忽略一个关键细节——Log4j2配置文件的默认查找路径是classpath根目录且文件名必须严格匹配log4j2.xml或log4j2-spring.xml2. 现场勘查五步定位法揪出真凶2.1 第一步确认MyBatis日志工厂选择MyBatis内置的日志工厂会按以下顺序自动检测日志实现SLF4JApache Commons LoggingLog4j2Log4jJDK logging强制指定日志实现在mybatis-config.xml中settings setting namelogImpl valueLOG4J2/ /settings2.2 第二步验证配置文件加载情况启用Log4j2内部调试模式JVM参数-Dorg.apache.logging.log4j.simplelog.StatusLogger.levelTRACE启动时会打印类似信息TRACE StatusLogger Log4j2配置文件查找路径 classpath:log4j2-test.yaml classpath:log4j2-test.yml classpath:log4j2-test.json classpath:log4j2-test.jsn classpath:log4j2-test.xml classpath:log4j2.yaml classpath:log4j2.yml classpath:log4j2.json classpath:log4j2.jsn classpath:log4j2.xml2.3 第三步检查依赖冲突用mvn dependency:tree查看依赖树特别注意是否存在多个日志门面如同时有slf4j和commons-logging是否有旧版log4j1.x残留桥接包版本是否匹配典型冲突案例!-- 错误示例log4j-to-slf4j和log4j-core同时存在 -- dependency groupIdorg.apache.logging.log4j/groupId artifactIdlog4j-to-slf4j/artifactId !-- 这个会把日志转到SLF4J -- version2.17.1/version /dependency dependency groupIdorg.apache.logging.log4j/groupId artifactIdlog4j-core/artifactId !-- 这是真正的Log4j2实现 -- version2.17.1/version /dependency2.4 第四步验证Mapper接口日志级别Log4j2配置中必须明确设置MyBatis Mapper接口的日志级别Logger namecom.yourpackage.mapper levelTRACE additivityfalse AppenderRef refCONSOLE/ /Logger2.5 第五步检查Spring特殊配置如果使用Spring Boot注意这些陷阱默认日志系统优先级Logback Log4j2需要排除spring-boot-starter-loggingdependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter/artifactId exclusions exclusion groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-logging/artifactId /exclusion /exclusions /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-log4j2/artifactId /dependency3. 高级侦查那些鲜为人知的配置陷阱3.1 配置文件命名玄机不同环境下的最佳实践环境类型推荐文件名特点说明普通Java项目log4j2.xml放在resources根目录Spring项目log4j2-spring.xml支持Spring环境变量占位符测试环境log4j2-test.xml只在test作用域生效动态配置非标准名称需手动指定-Dlog4j.configurationFile路径3.2 类加载器冲突诊断在Web容器中运行时可能出现类加载器隔离问题。通过以下代码检查public class ClassLoaderChecker { public static void main(String[] args) { System.out.println(Log4j2 Core: org.apache.logging.log4j.LogManager.class.getClassLoader()); System.out.println(MyBatis: org.apache.ibatis.logging.LogFactory.class.getClassLoader()); } }3.3 异步日志配置优化高性能场景建议使用异步日志但要正确配置Configuration Appenders Console nameCONSOLE targetSYSTEM_OUT PatternLayout pattern%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n/ /Console Async nameASYNC bufferSize262144 AppenderRef refCONSOLE/ /Async /Appenders Loggers Root leveldebug AppenderRef refASYNC/ /Root /Loggers /Configuration4. 终极武器诊断工具包4.1 自制检测脚本创建LogConfigDiagnostic.javapublic class LogConfigDiagnostic { public static void check() { // 检查生效的日志实现 System.out.println(MyBatis实际使用的日志实现: LogFactory.getLog(LogConfigDiagnostic.class).getClass().getName()); // 打印Log4j2配置状态 LoggerContext ctx (LoggerContext) LogManager.getContext(false); System.out.println(Log4j2配置文件: ctx.getConfiguration().getName()); // 检查Mapper接口日志级别 Logger mapperLogger LogManager.getLogger(com.yourpackage.mapper); System.out.println(Mapper日志级别: mapperLogger.getLevel()); } }4.2 常用诊断命令速查表场景命令/代码预期输出查看加载的配置文件-Dlog4j2.debugtrue控制台显示配置文件加载路径测试特定类日志级别logger.isTraceEnabled()返回boolean值动态修改日志级别Configurator.setLevel(com.pkg, Level.DEBUG)实时生效检测SLF4J绑定情况SLF4JServiceProvider.getProvider()显示实际绑定的日志实现4.3 典型错误对照表现象描述可能原因解决方案控制台无任何日志配置文件未加载检查文件名和路径只有部分日志缺失日志级别设置过高调整特定package的日志级别日志重复输出additivity属性设置不当设置additivityfalse日志格式异常PatternLayout配置错误检查pattern字符串性能明显下降同步日志高频日志改用异步日志那次深夜排查让我记忆犹新——原来是因为测试环境有人偷偷放了个log4j2-test.xml在test/resources里覆盖了主配置。现在我的标准操作流程是先用-Dlog4j2.debugtrue启动确认实际加载的配置文件位置这能节省至少80%的排查时间。