解决logback不打印mybatis的SQL日志的问题
工作这么多年,今天还是因为Logback的这个问题稍微卡了一下,惭愧。
问题描述:
logback配置了如下信息:
<appender name="file" .....>
...此处省略File Appender内容
</appender>
<appender name="sql" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>${logbase}sql.%d{yyyy-MM-dd}.log</FileNamePattern> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>[%d{yyyy-MM-dd HH:mm:ss} [%t] [%X{traceId}] %5p %c:%L] %m%n</pattern> </encoder> </appender> <logger name="com.xcorp.dao" level="DEBUG" additivity="false"> <appender-ref ref="sql" /> </logger> <logger name="org.mybatis" level="DEBUG" additivity="false" > <appender-ref ref="sql" /> </logger> <root level="DEBUG"> <appender-ref ref="console" /> <appender-ref ref="file" /> </root>
可以看到sql这个appender配置, 这里文件是 sql-时间戳.log
<FileNamePattern>${logbase}sql.%d{yyyy-MM-dd}.log</FileNamePattern>
但是日志不在 sql-时间戳.log中,而在 file中(file appender的配置文中没有给出, 省略)。
后面看file的日志发现(如果你没有file,那么配置console, 然后就看 console ),我这种情况是 Mybatis Mapper的日志都是以dao开头
那么好,修改 logger name ="dao",问题解决。
<logger name="dao" level="DEBUG" additivity="false"> <appender-ref ref="sql" /> </logger> <logger name="org.mybatis" level="DEBUG" additivity="false" > <appender-ref ref="sql" /> </logger> <root level="DEBUG"> <appender-ref ref="console" /> <appender-ref ref="file" /> </root>
为什么我这里是Mybatis Mapper的日志都是以dao开头?
查看mybatis-config.xml配置文件后,发现:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <setting name="useGeneratedKeys" value="true"/> <setting name="cacheEnabled" value="true" /> <setting name="lazyLoadingEnabled" value="false" /> <setting name="mapUnderscoreToCamelCase" value="true"/> <setting name="logPrefix" value="dao."/> </settings> </configuration>
logPrefix="dao.", 这句导致dao的日志,不是以他原来的包名,而是以dao.开头. 因此 logger name=""不写dao开头的name, 就无法匹配, 导致无法打印到对应的appender所创建的文件内.