java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > MybatisPlus LogBack 打印sql日志

LogBack+MybatisPlus实现打印sql日志

作者:好运仔dzl

本文主要介绍了LogBack+MybatisPlus实现打印sql日志,设置异步appender实现按天滚动切割日志,保留3天历史并自动清理,替代P6Spy避免日志过大,同时需配置MybatisPlus日志输出路径,并区分MyBatis与MyBatisPlus日志输出

首先在配置文件里面配置MybatisPlus的打印日志的相关配置

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl  # 使用 Slf4j 作为日志实现

然后在logback-spring.xml配置中定义一个appender用于输出sql日志,appender是logback的日志输出器,通过file指定日志输出的目录和文件名称,rollingPolicy表示是滚动策略,按天滚动切割日志文件进行备份,也就是当天的日志会在写sql.log里面,历史日志,例如说昨天的日志会被切割一份另外存起来,maxHistory是只存3天日志,其他的历史日志都会被删除掉,如下所示

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="log.path" value="./logs"/>
    <property name="console.log.pattern"
              value="%red(%d{yyyy-MM-dd HH:mm:ss}) %highlight([%-5level]) [%X{traceId}] %green([%thread]) %boldMagenta(%logger{36})[%line] - %msg%n"/>
    <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} [%-5level] [%X{traceId}] [%thread] %logger{36}[%line] - %msg%n"/>
 
    <contextListener class="com.xdf.smart.edu.common.log.listener.TtlMDCListener" />
    <!-- 控制台输出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${console.log.pattern}</pattern>
            <charset>utf-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
    </appender>
 
    <!-- SQL 日志 appender -->
    <appender name="file_sql" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sql.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/sql.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 3 天 -->
            <maxHistory>3</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <!-- 过滤的级别,只记录 DEBUG 及以上级别的日志 -->
            <level>DEBUG</level>
        </filter>
    </appender>
 
    <!-- sql异步输出 -->
    <appender name="async_sql" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃 TRACE、DEBUG、INFO 级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>512</queueSize>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref="file_sql"/>
    </appender>
 
    <!-- 统一打印 MyBatis 和 MyBatis-Plus 的 SQL 相关日志 -->
    <logger name="com.baomidou.mybatisplus" level="DEBUG" additivity="false">
        <appender-ref ref="async_sql"/>
    </logger>
 
    <!--系统操作日志-->
    <root level="INFO">
        <appender-ref ref="console"/>
    </root>
 
</configuration>

上面就是单纯配了一个sql日志打印的appender,用来打印sql执行日志,运行jar包后会在jar包的同级目录自己创建一个log文件夹,里面放sql.log文件。

在 Logback 里,logger 与 root 标签都能引用 appender 来输出日志。

所以上面的配置就是在logger标签里使用async_sql这个appender来打印sql日志,而async_sql其实就只是配置了异步输出,在async_sql里面又添加了file_sql来打印sql日志,这样可以实现异步打印sql执行日志,需要注意的是要记得修改上面logger标签里面的mapper接口的类路径

下面提供完整的LogBack配置,通常就是打印info、error日志、sql日志,由于平常用日志排查问题用的少,所以这里只保留3天历史,特别是sql日志,很快就会文件变得很大,因为sql执行的日志都会写进去,所以更不能保留太久,之前就是sql日志都是通过P6Spy去写入到同一个文件里面,导致直接日志文件占了40多G的内存,所以这里改成了用mybatisplus日志切割,下面提供了常用的日志配置,注意我这个系统是因为同时用来mybatis和mybatisPlus,所以两个日志都要打印

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="log.path" value="./logs"/>
    <property name="console.log.pattern"
              value="%red(%d{yyyy-MM-dd HH:mm:ss}) %highlight([%-5level]) [%X{traceId}] %green([%thread]) %boldMagenta(%logger{36})[%line] - %msg%n"/>
    <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} [%-5level] [%X{traceId}] [%thread] %logger{36}[%line] - %msg%n"/>
 
    <contextListener class="com.xdf.smart.edu.common.log.listener.TtlMDCListener" />
    <!-- 控制台输出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${console.log.pattern}</pattern>
            <charset>utf-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
    </appender>
 
    <!-- SQL 日志 appender -->
    <appender name="file_sql" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sql.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/sql.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 3 天 -->
            <maxHistory>3</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <!-- 过滤的级别,只记录 DEBUG 及以上级别的日志 -->
            <level>DEBUG</level>
        </filter>
    </appender>
 
    <!-- 系统日志输出 -->
    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/exam-mark-info.log</file>
        <!-- 滚动策略:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/exam-mark-info.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 3天 -->
            <maxHistory>3</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>INFO</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
 
    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/exam-mark-error.log</file>
        <!-- 滚动策略:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/exam-mark-error.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 3天 -->
            <maxHistory>3</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>ERROR</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
 
    <!-- info异步输出 -->
    <appender name="async_info" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃 TRACE、DEBUG、INFO 级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>512</queueSize>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref="file_info"/>
    </appender>
 
    <!-- error异步输出 -->
    <appender name="async_error" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃 TRACE、DEBUG、INFO 级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>512</queueSize>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref="file_error"/>
    </appender>
 
    <!-- sql异步输出 -->
    <appender name="async_sql" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃 TRACE、DEBUG、INFO 级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>512</queueSize>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref="file_sql"/>
    </appender>
 
    <!-- 【打印MyBatisPlus条件构造器的日志】 -->
    <logger name="com.baomidou.mybatisplus" level="DEBUG" additivity="false">
        <appender-ref ref="async_sql"/>
    </logger>
    <!-- 这个logger的name需要改成自己mapper接口的类路径【打印MyBatis日志】 -->
    <logger name="com.xxx.mapper" level="DEBUG">
        <appender-ref ref="async_sql"/>
    </logger>
 
    <!--系统操作日志-->
    <root level="INFO">
        <appender-ref ref="console"/>
        <appender-ref ref="async_info"/>
        <appender-ref ref="async_error"/>
    </root>
 
</configuration>

到此这篇关于LogBack+MybatisPlus实现打印sql日志的文章就介绍到这了,更多相关MybatisPlus LogBack 打印sql日志内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文