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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【Log日志】打印mybatis中sql日志并存放到指定文件中

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

logback-spring.xml (如果是logbackx.xml 动态路径会失效)

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <!-- 子节点<property> :用来定义变量值,它有两个属性name和value,通过<property>定义的值会被插入到logger上下文中,可以使“${}”来使用变量-->
  <property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss} %c{1} %L [%p] %m%n %caller{0}"/>
  <!-- 获取Environment中的值; 属性文件中可以设置 log.path的值来动态变更路径-->
  <springProperty scope="context" name="log.path" source="log.path"/>
  <!-- 把日志输出到控制台-->
  <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
    <encoder charset="UTF-8">
      <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度,%msg:日志消息,%n是换行符-->
      <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{50} >>> %msg%n</pattern>
    </encoder>
  </appender>
  <appender name="common" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${log.path}/common.log</file>
    <!-- 如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。 -->
    <append>true</append>
    <!-- 对记录事件进行格式化 -->
    <encoder>
      <pattern>${pattern}</pattern>
    </encoder>
    <!-- 匹配>=INFO级别的日志-->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>INFO</level>
      <onMatch>ACCEPT</onMatch>
      <onMismatch>DENY</onMismatch>
    </filter>
    <!-- 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动-->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>${log.path}/common.log.%d{yyyy-MM-dd}</fileNamePattern>
      <!-- 可选节点,控制保留的归档文件的最大天数。-->
      <maxHistory>10</maxHistory>
    </rollingPolicy>
  </appender>
  <appender name="exception" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${log.path}/exception.log</file>
    <append>true</append>
    <!-- 匹配>=ERROR级别的日志-->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>ERROR</level>
      <onMatch>ACCEPT</onMatch>
      <onMismatch>DENY</onMismatch>
    </filter>
    <encoder>
      <pattern>${pattern}</pattern>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>${log.path}/exception.log.%d{yyyy-MM-dd}</fileNamePattern>
      <maxHistory>7</maxHistory>
    </rollingPolicy>
  </appender>
  <appender name="mysql_log" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${log.path}/mysql_log.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- 日志文件输出文件名 -->
      <FileNamePattern>${log.path}/mysql_log.log.%d{yyyy-MM-dd}</FileNamePattern>
      <!-- 日志文件保留天数 -->
      <MaxHistory>7</MaxHistory>
    </rollingPolicy>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
      <pattern>${pattern}</pattern>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>DEBUG</level>
    </filter>
  </appender>
  <!-- 打印mysql日志  name= 存放mapper的包名; 注意mybatis-plus.configuration.log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
    如果log-impl: org.apache.ibatis.logging.stdout.StdOutImpl ;则只会打印到控制台;不会存放到文件
  -->
  <logger name="com.xxx.mapper" level="DEBUG" additivity="false">
    <appender-ref ref="stdout"/>
    <appender-ref ref="mysql_log" />
  </logger>
  <!-- 用来设置某一个包或具体的某一个类的日志打印级别、以及指定<appender>。
  name: 用来指定受此loger约束的某一个包或者具体的某一个类。
    level: 如果未设置此属性,那么当前loger将会继承上级的级别。上级是<root>
  addtivity:是否向上级logger传递打印信息。默认是true
  -->
  <!--它是根loger,是所有<loger>的上级。只有一个level属性,因为name已经被命名为"root",且已经是最上级了。 -->
  <root level="INFO">
    <appender-ref ref="stdout"/>
    <appender-ref ref="common"/>
    <appender-ref ref="exception"/>
  </root>
</configuration>

几个关键点


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

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


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

<logger name="com.xxx.mapper" level="DEBUG" additivity="false">
    <appender-ref ref="stdout"/>
    <appender-ref ref="mysql_log" />
  </logger>

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

# 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
mybatis-plus:
  configuration:
      #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
      # 这个配置会将执行的sql打印出来,这个可以存放在文件中 StdOutImpl的是只能打印到控制台
      log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl

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


参数值的默认值设置

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


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
19天前
|
缓存 监控 算法
分析慢日志文件来优化 PHP 脚本的性能
分析慢日志文件来优化 PHP 脚本的性能
|
29天前
|
消息中间件 存储 监控
Kafka的logs目录下的文件都是什么日志?
Kafka的logs目录下的文件都是什么日志?
43 11
|
26天前
|
Java
日志框架log4j打印异常堆栈信息携带traceId,方便接口异常排查
日常项目运行日志,异常栈打印是不带traceId,导致排查问题查找异常栈很麻烦。
|
1月前
|
存储 监控 数据可视化
SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
【9月更文挑战第2天】SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
70 9
|
11天前
|
Python
Python如何将日志输入到文件里
Python如何将日志输入到文件里
|
1月前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
64 0
|
2月前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
72 0
|
2月前
|
C# Windows 监控
WPF应用跨界成长秘籍:深度揭秘如何与Windows服务完美交互,扩展功能无界限!
【8月更文挑战第31天】WPF(Windows Presentation Foundation)是 .NET 框架下的图形界面技术,具有丰富的界面设计和灵活的客户端功能。在某些场景下,WPF 应用需与 Windows 服务交互以实现后台任务处理、系统监控等功能。本文探讨了两者交互的方法,并通过示例代码展示了如何扩展 WPF 应用的功能。首先介绍了 Windows 服务的基础知识,然后阐述了创建 Windows 服务、设计通信接口及 WPF 客户端调用服务的具体步骤。通过合理的交互设计,WPF 应用可获得更强的后台处理能力和系统级操作权限,提升应用的整体性能。
73 0
|
11天前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
3月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
69 13