前言
一、问题描述
在生产上遇到问题时,经常需要查询日志文件,有时会需要查询执行的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-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>