logback+slf4j解决Mybatis执行sql写入日志文件的问题(亲测可行)

文章目录

  • 前言
  • 一、问题描述
  • 二、解决方案


前言

一、问题描述

在生产上遇到问题时,经常需要查询日志文件,有时会需要查询执行的sql以及执行结果,所以Mybatis执行sql不仅要能在控制台打印输出,还要能写入日志文件待查。之前看过的好多博客只是解决了日志向控制台打印的问题。
由于Mybatis执行sql的日志级别为DEBUG,一般生产上需要的日志级别为INFO及以上。如果将DEBUG级别日志全部写入日志文件,会造成日志查问题的速度降低,难度大大提高。所以Mybatis执行sql的日志只能向更高日志级别的日志文件追加或单独写入一个文件。

二、解决方案

application.properties加上日志配置,不能使用StdOutImpl,因为这种配置只能打印控制台

mybatis.configuration.log-impl= org.apache.ibatis.logging.slf4j.Slf4jImpl

logback-spring.xml中下图配置关键
logback+slf4j解决Mybatis执行sql写入日志文件的问题(亲测可行)_第1张图片

logback-spring.xml写法

<?xml version="1.0" encoding="UTF-8"?>
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒当scan为true时,此属性生效。默认的时间间隔为1分钟。
    debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration debug="true" scan="true" scanperiod="1800 seconds">
    <!-- 定义属性,类似于maven,可以当做变量被引用 -->
    <springProperty scope="context" name="APP_NAME" source="logback.appName" defaultValue=项目名或模块名/>
    <springProperty scope="context" name="LOG_HOME" source="logback.logHome" defaultValue=日志存放路径/>
    <springProperty scope="context" name="LOG_LEVEL" source="logback.logLevel" defaultValue="info"/>

    <!-- 输出到控制台 -->
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 日志的格式化 -->
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %tid [%thread] %-5level %logger{50} - %msg%n</Pattern>
        </encoder>
    </appender>
      <property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %tid [%thread] %-5level %logger{50} - %msg%n"/>
    <!-- 输出到文件,根据大小和时间来切分 -->
    <appender name="infoFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/${APP_NAME}-info.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 按日滚动,注意%i是必须的,表示文件的索引号,从0开始累加 -->
            <fileNamePattern>${LOG_HOME}/${APP_NAME}-%d{yyyy-MM-dd}.%i-info.log</fileNamePattern>
            <!-- 每个文件最大为100MB,最多保存60个文件数量,并且所有文件总和不能大于20GB。 -->
            <maxFileSize>200MB</maxFileSize>
            <maxHistory>150</maxHistory>
            <totalSizeCap>30GB</totalSizeCap>
        </rollingPolicy>

        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>

        <!-- 日志的格式化 -->
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
                <Pattern>${FILE_LOG_PATTERN}</Pattern>
        </encoder>
    </appender>
     <!-- 输出到文件,根据大小和时间来切分 -->
    <appender name="errorFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/${APP_NAME}-error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 按日滚动,注意%i是必须的,表示文件的索引号,从0开始累加 -->
            <fileNamePattern>${LOG_HOME}/${APP_NAME}-%d{yyyy-MM-dd}.%i-error.log</fileNamePattern>
            <!-- 每个文件最大为100MB,最多保存60个文件数量,并且所有文件总和不能大于20GB。 -->
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>100</maxHistory>
            <totalSizeCap>10GB</totalSizeCap>
        </rollingPolicy>

        <!-- 仅输出ERROR以上级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>

        <!-- 日志的格式化 -->
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
                <Pattern>${FILE_LOG_PATTERN}</Pattern>
        </encoder>
    </appender>

    <appender name="sqlFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/${APP_NAME}-sql.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 按日滚动,注意%i是必须的,表示文件的索引号,从0开始累加 -->
            <fileNamePattern>${LOG_HOME}/${APP_NAME}-%d{yyyy-MM-dd}.%i-sql.log</fileNamePattern>
            <!-- 每个文件最大为100MB,最多保存60个文件数量,并且所有文件总和不能大于20GB。 -->
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>100</maxHistory>
            <totalSizeCap>10GB</totalSizeCap>
        </rollingPolicy>
        <!-- 日志的格式化 -->
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
                <Pattern>${FILE_LOG_PATTERN}</Pattern>
        </encoder>
    </appender>


    <logger name=mapper的包路径或Dao层路径 level="debug">
         <!-- 追加到sqlFile日志文件中,文件名与上文定义的日志文件名要一致-->
        <appender-ref ref="sqlFile" />
         <!-- 追加到infoFile日志文件中,文件名与上文定义的日志文件名要一致 -->
        <appender-ref ref="infoFile" />
    </logger>



    <!-- 配置根节点。指定日志的默认基本和输出方向。 -->
    <root level="${LOG_LEVEL}">
        <appender-ref ref="stdout" />
        <appender-ref ref="infoFile" />
        <appender-ref ref="errorFile" />
    </root>
</configuration>

你可能感兴趣的:(运维)