log4j2实战--将MyBatis执行SQL记录到文件,按天分存

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 需求:将Mybatis的执行SQL,按天存日志文件。项目使用的是log4j2。原先项目,都是将所有日志通通打印到控制台。现在需要将系统接收用户请求后,Mybatis的执行SQL,按天存日志文件。

需求:将Mybatis的执行SQL,按天存日志文件。项目使用的是log4j2。

原先项目,都是将所有日志通通打印到控制台。现在需要将系统接收用户请求后,Mybatis的执行SQL,按天存日志文件。

当时在想:
把Mybatis的SQL打印到控制台容易实现,
日志按Level级别 按天存文件也容易实现,
但如何单独把Mybatis的SQL,按天存日志文件呢?

于是找了MyBatis日志配置说明
http://www.mybatis.org/mybatis-3/zh/logging.html

Mybatis 的内置日志工厂提供日志功能,内置日志工厂将日志交给以下其中一种工具作代理:

  • SLF4J
  • Apache Commons Logging
  • Log4j 2
  • Log4j
  • JDK logging

MyBatis 内置日志工厂基于运行时自省机制选择合适的日志工具。它会使用第一个查找得到的工具(按上文列举的顺序查找)。如果一个都未找到,日志功能就会被禁用。

可以在mybatis-config.xml 中,设定使用的日志组件。

<configuration>
  <settings>
    ...
    <setting name="logImpl" value="LOG4J2"/>
    ...
  </settings>
</configuration>

logImpl 可选的值有:SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING,或者是实现了接口org.apache.ibatis.logging.Log 的,且构造方法是以字符串为参数的类的完全限定名。



通过学习发现:Mybatis 中 SQL 语句的日志级别被设为DEBUG(JDK 日志设为 FINE),SQL执行结果的日志级别为 TRACE(JDK 日志设为 FINER)。

所以,如果某些查询可能会返回庞大的结果集,此时只想记录其执行的 SQL 语句而不想记录结果该怎么办,只要将日志级别调整为 DEBUG 即可达到目的。

可见:无论使用哪个日志组件、无论打印什么内容,均是按日志级别进行输出的。所以在本需求中,Mybatis的SQL按debug级别输出到指定地方即可。

无论是Mybatis框架,还是Spring、Java Mail框架,如果想看到框架底层运行的日志信息,配置日志级别为debug即可。

再次说明下,Mybatis 内置日志工厂将日志交给其中一种日志工具作代理。具体怎么做,由使用的日志工具决定,因此本需求MyBatis执行SQL的文件保存,是取决于使用的log4j2日志组件实现。

下面就来看一下log4j2具体的配置。

在log4j2中, 共有8个输出级别,按照从低到高为:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF。

log4j2 的配置文件支持 xml、json、jsn 三种格式,默认情况下由系统自动加载,其要在classpath 可加载到的目录下。

日志配置文件主要配置2大类
1、配置输出源<Appenders>:日志输出到哪里。如控制台、file等
2、具体的日志配置<Loggers>:配置name,启用哪个Appender,以及日志级别等。

下面给出本需求的简单配置实现:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="ERROR" monitorInterval="600">
    <!-- configure.status 为设置日志输出级别,级别如下:OFF 、FATAL 、ERROR、WARN、INFO、DEBUG、TRACE、ALL -->
    <!-- configure.monitorInterval 监控间隔 指log4j2每隔600秒(10分钟),自动监控该配置文件是否有变化,如果变化,则自动根据文件内容重新配置 -->

    <Properties>
        <property name="pattern">%d{yyyy/MM/dd HH:mm:ss.SSS} [%p] %t %c %m%n</property>
        <property name="basePath">/Users/lijianhua/Documents/my-log</property>
    </Properties>

    <!--配置appenders源:日志输出的地址-->
    <Appenders>

        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="${pattern}"/>
        </Console>

        <RollingRandomAccessFile name="fileLogger"
                                 fileName="${basePath}/mybatis-sql.log"
                                 filePattern="${basePath}/mybatis-sql-%d{yyyy-MM-dd}.log"
                                 append="true">
            <PatternLayout pattern="${pattern}"/>

            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="100MB"/>
            </Policies>
        </RollingRandomAccessFile>
    </Appenders>

    <!--配置logers:级别、使用的输出地-->
    <Loggers>
        <Logger name="com.ljheee.app.dao" level="debug" additivity="true">
            <appender-ref ref="fileLogger" level="debug"/>
        </Logger>

        <Root level="info" additivity="false">
            <appender-ref ref="console"/>
        </Root>
    </Loggers>
</Configuration>

通常log4j 采用properties文件配置。log4j2 采用xml文件配置。

log4j2 的xml文件配置,根节点是<Configuration>,它有2个可选属性:

  • status 为设置日志输出级别,级别如下:OFF 、FATAL 、ERROR、WARN、INFO、DEBUG、TRACE 、ALL
  • monitorInterval 监控间隔 指log4j2每隔600秒(10分钟),自动监控该配置文件是否有变化,如果变化,则自动根据文件内容重新配置。

1、配置输出源<Appenders>:

配置日志输出到哪里。如控制台、file等。

<Appenders>下通常有一个<Console> 表示日志都输出到控制台,方便开发期间进行查看。

另一个是<RollingRandomAccessFile>,按时间和文件大小滚动(rollover)的RollingRandomAccessFile Appender,名字真是够长,但不光只是名字长,相比RollingFileAppender有很大的性能提升,官网宣称是20-200%。

rollover的意思是当满足一定条件(如文件达到了指定的大小,达到了指定的时间)后,就重命名原日志文件进行归档,并生成新的日志文件用于log写入。如果还设置了一定时间内允许归档的日志文件的最大数量,将对过旧的日志文件进行删除操作。

这里说的“满足一定条件”,是需要触发的,需要配置基于时间的、或基于日志文件大小的触发策略,也就是如下配置:

            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="100MB"/>
            </Policies>

关键点在于 filePattern后的日期格式,以及TimeBasedTriggeringPolicy的interval,日期格式精确到哪一位,interval也精确到哪一个单位。在本示例中,filePattern最小单位是天,interval=1也就是一天一个日志文件。

TimeBasedTriggeringPolicy基于时间的触发策略
属性 解释
interval (integer)该属性是相对 RollingFile.filePattern 中的 %d{yyyy-MM-dd}值,例:filePattern=”xxx%d{yyyy-MM-dd}xx” interval=”2” 表示将2天一个日志文件;filePattern=”xxx%d{yyyy-MM-dd-HH}xx” interval=”1”表示一个小时一个日志文件
modulate (boolean)以0点为边界进行偏移计算

2、具体的日志配置<Loggers>:

配置name,启用哪个Appender,以及日志级别等。

重点说明

<Logger name="com.ljheee.app.dao" level="debug" additivity="true">
            <appender-ref ref="fileLogger" level="debug"/>
</Logger>

MyBatis支持多种粒度的日志记录:

1、可以记录某个映射器接口的日志
将name设为name="com.ljheee.app.dao.UserMapper"
就会记录 com.ljheee.app.dao.UserMapper 的详细执行操作,且仅记录应用中其它类的错误信息(若有)。

2、还可以将日志的记录方式从接口级别切换到语句级别,从而实现更细粒度的控制。如下配置只对 select 语句记录日志:
将name设为name="com.ljheee.app.dao.UserMapper.select"

3、当然也可以按实例配置到包级别,在DAO层,将包下所有MyBatis的mapper接口均使用日志记录。

小结:

log4j2 是Apache开发的一款log4j的升级产品,在某些特定的场景上面,甚至可以比之前的速度快上10倍。在保证log的组件更加快速的同时,同时所需的内存更加少。

上面在说RollingRandomAccessFile时,也说到性能很高,因为log4j2 内部使用了Disruptor高性能并发框架,输出日志采用异步输出,极高地提升了日志输出性能,因此也建议将后续的应用日志方式,切换到log4j2。

log4j2 配置示例https://howtodoinjava.com/log4j2/log4j-2-xml-configuration-example/
log4j2文档https://logging.apache.org/log4j/2.x/manual/appenders.html

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
28天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
132 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
28天前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的控制文件与归档日志文件
本文介绍了Oracle数据库中的控制文件和归档日志文件。控制文件记录了数据库的物理结构信息,如数据库名、数据文件和联机日志文件的位置等。为了保护数据库,通常会进行控制文件的多路复用。归档日志文件是联机重做日志文件的副本,用于记录数据库的变更历史。文章还提供了相关SQL语句,帮助查看和设置数据库的日志模式。
【赵渝强老师】Oracle的控制文件与归档日志文件
|
1月前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
20天前
|
SQL 数据库 UED
SQL性能提升秘籍:5步优化法与10个实战案例
在数据库管理和应用开发中,SQL查询的性能优化至关重要。高效的SQL查询不仅可以提高应用的响应速度,还能降低服务器负载,提升用户体验。本文将分享SQL优化的五大步骤和十个实战案例,帮助构建高效、稳定的数据库应用。
34 3
|
21天前
|
SQL 关系型数据库 MySQL
【赵渝强老师】MySQL的全量日志文件
MySQL全量日志记录所有操作的SQL语句,默认禁用。启用后,可通过`show variables like %general_log%检查状态,使用`set global general_log=ON`临时开启,执行查询并查看日志文件以追踪SQL执行详情。
|
28天前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle的参数文件与告警日志文件
本文介绍了Oracle数据库的参数文件和告警日志文件。参数文件分为初始化参数文件(PFile)和服务器端参数文件(SPFile),在数据库启动时读取并分配资源。告警日志文件记录了数据库的重要活动、错误和警告信息,帮助诊断问题。文中还提供了相关视频讲解和示例代码。
|
16天前
|
SQL Java 数据库连接
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
|
20天前
|
SQL 缓存 监控
SQL性能提升指南:五大优化策略与十个实战案例
在数据库性能优化的世界里,SQL优化是提升查询效率的关键。一个高效的SQL查询可以显著减少数据库的负载,提高应用响应速度,甚至影响整个系统的稳定性和扩展性。本文将介绍SQL优化的五大步骤,并结合十个实战案例,为你提供一份详尽的性能提升指南。
42 0
|
1月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
223 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
2月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
279 3