目录
第一步:首先处理pom.xml中的依赖关系,将日志的实现切换为logback;
第三步:看一下mybatis源代码BaseExceutor底层原因
springboot+mybatis日志转换——log4j转logback配置文件怎么配
公司的项目一直都是运行起来会打印所有执行的语句:
好处是:一旦出现问题方便排查,可以清晰的知道走到了项目的哪一步,排查问题快的话可能连debug都不需要;
坏处是:正常情况下,控制台一些无用的日志信息量多且密无重点,不方便日常的调试开发。
项目没有采用分布式的架构,总体的架构设计和风格较自由TT,最近大佬看我比较闲,让我处理一个小问题:
项目有多个服务,相互推送消息,其中除一服务(假设monitor)外使用的日志实现用的是log4j,其他服务都是logback。项目架构使用的springboot,因此统一使用logback实现。(springboot底层选用slf4j+logback方式进行日志记录)
第一步:首先处理pom.xml中的依赖关系,将日志的实现切换为logback;
1.排除掉log4j,保证有spring-boot-starter-logging
<!--日志-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<!--<exclusions>-->
<!--<exclusion>-->
<!--<groupId>org.springframework.boot</groupId>-->
<!--<artifactId>spring-boot-starter-logging</artifactId>-->
<!--</exclusion>-->
<!--</exclusions>-->
</dependency>
经查看jar包依赖关系,发现原将spring-boot-starter-logging依赖排除出去了,只需将这部分注释掉即可,也无需导入新的依赖。因为spring-boot-starter底层已经为我们导入了spring-boot-starter-logging的依赖,它底层又适配了log4j,jul,jcl等日志实现~
(Springboot把其他的日志替换成了slf4j)
<dependencies>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
</dependency>
</dependencies>
第二步:修改mybatis-config.xml
研究了一天,本来都要放弃这种实现方法啦,奈何一直心有挂念,就多试了几次:
原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>
<!-- 将log实现设置为log4j.默认是jdk的log -->
<setting name="logImpl" value="LOG4J"/>
<!-- 使全局的映射器启用或禁用缓存。 -->
<setting name="cacheEnabled" value="true"/>
<!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。 -->
<setting name="aggressiveLazyLoading" value="true"/>
<!-- 是否允许单条sql 返回多个数据集 (取决于驱动的兼容性) default:true -->
<setting name="multipleResultSetsEnabled" value="true"/>
<!-- 是否可以使用列的别名 (取决于驱动的兼容性) default:true -->
<setting name="useColumnLabel" value="true"/>
<!-- 允许JDBC 生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。 default:false -->
<setting name="useGeneratedKeys" value="false"/>
<!-- 指定 MyBatis 如何自动映射 数据基表的列 NONE:不隐射 PARTIAL:部分 FULL:全部 -->
<setting name="autoMappingBehavior" value="PARTIAL"/>
<!-- 这是默认的执行类型 (SIMPLE: 简单; REUSE: 执行器可能重复使用prepared statements语句;BATCH: 执行器可以重复执行语句和批量更新) -->
<setting name="defaultExecutorType" value="SIMPLE"/>
<!-- 使用驼峰命名法转换字段。 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 设置本地缓存范围 session:就会有数据的共享 statement:语句范围 (这样就不会有数据的共享 ) defalut:session -->
<setting name="localCacheScope" value="SESSION"/>
<!-- 设置但JDBC类型为空时,某些驱动程序 要指定值,default:OTHER,插入空值时不需要指定类型 -->
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
<plugins>
<!-- <plugin interceptor="com.github.pagehelper.PageHelper">-->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="offsetAsPageNum" value="false"/>
<property name="rowBoundsWithCount" value="false"/>
<property name="pageSizeZero" value="true"/>
<property name="reasonable" value="false"/>
<property name="supportMethodsArguments" value="false"/>
<property name="returnPageInfo" value="none"/>
</plugin>
</plugins>
</configuration>
<!-- 将log实现设置为log4j.默认是jdk的log,即JDK_LOGGING -->
<setting name="logImpl" value="LOG4J"/>
不错,打印SQL只需要加一个setting就可以了,重点注意:此处如果配置log4j,其实打印输出还是log4j,而不是logback,如果logback也配置没问题,会重复打印两边相关日志信息,如果确定替换掉log4j,那么mybatis配置文件可不配置name="logimpl"的settings的标签,直接配置logback.xml即可。
科普:mybatis的日志打印方式比较多,SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING,可以根据自己的需要进行配置。
但是注意没有LOGBACK这一实现呦~,关于logimpl的设定值还不支持logback,如果用SLF4J是不好用的。这是官方文档的描述,见下图:
logback.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- <contextName>logback</contextName> -->
<property name="log.path" value="../as300_web_logs/service_monitor/service_monitor" />
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<!--输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!-- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">-->
<!-- <level>info</level>-->
<!-- </filter>-->
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<!-- <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern> -->
<!-- <pattern>%d{yyyy-MM-dd HH:mm:ss.S} [%thread] %-5level %logger{36} - %msg%n</pattern>-->
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<!--输出到文件-->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 按照日期和文件大小创建日志文件,每天一个文件,如果超过20M创建新的文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>20MB</maxFileSize>
<maxHistory>7</maxHistory> <!-- 最多保留7天的日志文件 -->
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- sql信息的打印 additivity="false"不会向上级logger(root节点)传递打印信息-->
<logger name="com.focus" level="debug" additivity="false">
<appender-ref ref="console"/>
<appender-ref ref="file" />
</logger>
<logger name="com.focous" level="debug" additivity="false">
<appender-ref ref="console"/>
<appender-ref ref="file" />
</logger>
<!-- mybatis日志打印-->
<logger name="org.apache.ibatis" level="debug" additivity="false">
<appender-ref ref="console"/>
</logger>
<logger name="java.sql" level="debug" additivity="false">
<appender-ref ref="console"/>
</logger>
<root level="info">
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>
</configuration>
百转千回~