> 文章列表 > 【LogBack日志】打印mybatis中sql日志并存放到指定文件中

【LogBack日志】打印mybatis中sql日志并存放到指定文件中

【LogBack日志】打印mybatis中sql日志并存放到指定文件中

前言:

在springboot中使用logbac-spring.xml单独打印mybaits中的sql,另存一个单独的日志中。

1、yml配置

# 日志配置
logging:level:com.xxxx.mapper: debugorg.springframework: warnconfig: classpath:logback-app.xmlfile:path: ./logs/app

2、logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration><property resource="application.yml"/><!-- 日志文件存放路径 --><springProperty scope="context" name="FILE_PATH" source="logging.file.path"/><!-- 文件输出格式 --><!-- 1格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--><property name="FILE_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:  %msg%n"/><!-- 日志最大保存数量 --><property name="MAX_HISTORY" value="10"/><!-- 日志文件大小 --><property name="FILE_SIZE" value="10MB"/><!-- info文件,记录info级别日志 --><appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 实时输出的日志文件 --><file>${FILE_PATH}/sys-info.log</file><append>true</append><!-- 历史日志分块,配置滚动的策略 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 日志名称的格式 --><fileNamePattern>${FILE_PATH}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern><!-- 保存的最长时间:天数 --><MaxHistory>${MAX_HISTORY}</MaxHistory></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${FILE_PATTERN}</pattern></encoder><!--日志文件最大的大小--><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><MaxFileSize>${FILE_SIZE}</MaxFileSize></triggeringPolicy><!-- 过滤掉非info的日志,即此日志文件中只会输出info日志 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 过滤的级别 --><level>INFO</level><!-- 匹配时的操作:接收(记录) --><onMatch>ACCEPT</onMatch><!-- 不匹配时的操作:拒绝(不记录) --><onMismatch>DENY</onMismatch></filter></appender><!-- error文件,记录error级别日志 --><appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 实时输出的日志文件 --><file>${FILE_PATH}/sys-error.log</file><append>true</append><!-- 历史日志分块,配置滚动的策略 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 日志名称的格式 --><fileNamePattern>${FILE_PATH}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern><!-- 保存的最长时间:天数 --><MaxHistory>${MAX_HISTORY}</MaxHistory></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${FILE_PATTERN}</pattern></encoder><!--日志文件最大的大小--><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><MaxFileSize>${FILE_SIZE}</MaxFileSize></triggeringPolicy><!-- 过滤掉非error的日志,即此日志文件中只会输出error日志 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 过滤的级别 --><level>ERROR</level><!-- 匹配时的操作:接收(记录) --><onMatch>ACCEPT</onMatch><!-- 不匹配时的操作:拒绝(不记录) --><onMismatch>DENY</onMismatch></filter></appender><!-- debug文件,记录debug级别日志 --><appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 实时输出的日志文件 --><file>${FILE_PATH}/sys-debug.log</file><append>true</append><!-- 历史日志分块,配置滚动的策略 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 日志名称的格式 --><fileNamePattern>${FILE_PATH}/sys-debug.%d{yyyy-MM-dd}.log</fileNamePattern><!-- 保存的最长时间:天数 --><MaxHistory>${MAX_HISTORY}</MaxHistory></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${FILE_PATTERN}</pattern></encoder><!--日志文件最大的大小--><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><MaxFileSize>${FILE_SIZE}</MaxFileSize></triggeringPolicy><!-- 过滤掉非debug的日志,即此日志文件中只会输出debug日志 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 过滤的级别 --><level>DEBUG</level><!-- 匹配时的操作:接收(记录) --><onMatch>ACCEPT</onMatch><!-- 不匹配时的操作:拒绝(不记录) --><onMismatch>DENY</onMismatch>></filter></appender><!-- sql文件,记录DEBUG级别日志 --><appender name="SQL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 实时输出的日志文件 --><file>${FILE_PATH}/sys-sql.log</file><append>true</append><!-- 历史日志分块,配置滚动的策略 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 日志名称的格式 --><fileNamePattern>${FILE_PATH}/sys-sql.%d{yyyy-MM-dd}.log</fileNamePattern><!-- 保存的最长时间:天数 --><MaxHistory>${MAX_HISTORY}</MaxHistory></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${FILE_PATTERN}</pattern></encoder><!--日志文件最大的大小--><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><MaxFileSize>${FILE_SIZE}</MaxFileSize></triggeringPolicy><!-- 过滤掉非debug的日志,即此日志文件中只会输出debug日志 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 过滤的级别 --><level>DEBUG</level><!-- 匹配时的操作:接收(记录) --><onMatch>ACCEPT</onMatch><!-- 不匹配时的操作:拒绝(不记录) --><onMismatch>DENY</onMismatch>></filter></appender><!-- 控制台输出 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${FILE_PATTERN}</pattern></encoder></appender><!-- 打印 Spring 在启动的时候初始化各个 Bean 的信息 --><logger name="org.springframework" level="WARN"/><!--mybatis日志 mapper包所在路径--><logger name="com.xxx.mapper" level="DEBUG" additivity="false"><appender-ref ref="SQL_FILE" /><appender-ref ref="STDOUT" /></logger><!-- 相当于logger元素,只是name值已经确定为root了 --><root level="INFO"><appender-ref ref="INFO_FILE" /><appender-ref ref="ERROR_FILE" /><appender-ref ref="DEBUG_FILE" /><appender-ref ref="STDOUT" /></root></configuration>

3、关键几点

几个关键点

a. 文件名需要为​​logback-spring.xml​​; 动态日志路径才会生效; 属性文件中配置 ​​log.path=xxx​​;

【Log日志】logback.xml动态配置属性值(包括接入的第三方配置)

b. levle 需要是DEBUG等级; 因为sql日志是DEBUG等级的;name= 存放mapper文件的包路径

<!--mybatis日志 mapper包所在路径--><logger name="com.xxx.mapper" level="DEBUG" additivity="false"><appender-ref ref="SQL_FILE" /><appender-ref ref="STDOUT" /></logger>

c. mybatis的log-impl需要配置正确的实现类 比如 在maybatis-plus中

# MyBatis配置
mybatis:# 搜索指定包别名typeAliasesPackage: com.xxx..domain# 配置mapper的扫描,找到所有的mapper.xml映射文件mapperLocations: classpath*:mapper//*Mapper.xmlconfiguration:# 指定 MyBatis 所用日志的具体实现log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl# 开启自动下划线格式转驼峰格式map-underscore-to-camel-case: true# 全局映射器启用缓存cache-enabled: true# 允许 JDBC 支持自动生成主键use-generated-keys: true# 执行模式。默认是 SIMPLEdefault-executor-type: reuse# 允许查询结果为nullcall-setters-on-nulls: true

d. 我之前就是一直配置的是 ​​log-impl: org.apache.ibatis.logging.stdout.StdOutImpl​​ ;导致文件只能出现在控制台;却没有打印到文件中;

参数值的默认值设置
如果配置文件没有设置属性. 可以在使用的地方设置默认值 例如​​​${log.path:-默认值}​

参考资料:
https://blog.51cto.com/szzdzhp/5300674
https://blog.csdn.net/happyxin_/article/details/128844723?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7EPosition-2-128844723-blog-116700232.235%5Ev28%5Epc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7EPosition-2-128844723-blog-116700232.235%5Ev28%5Epc_relevant_default&utm_relevant_index=3
https://blog.csdn.net/DreamMryang/article/details/115351202