Mybatis 日志(JDK Log)

news2025/1/16 2:34:15

上一篇我们介绍了Mybatis中的参数,本篇我们使用JDK Log打印一下Mybatis运行时的日志,看一下Mybatis执行的过程。

这里我选取上一篇的示例进行JDK Log的集成,这里如果您想对上一篇进行详细了解,可以参考:

Mybatis参数(parameterType)icon-default.png?t=N7T8https://blog.csdn.net/m1729339749/article/details/132548838

一、配置Mybatis

在mybatis-config.xml文件中配置logImpl

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="logImpl" value="JDK_LOGGING"/>
    </settings>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="org.gjt.mm.mysql.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/demo?useUnicode=true&amp;useSSL=false&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="horse"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="demo/UserInfoMapper.xml" />
    </mappers>
</configuration>

在配置文件中,我们配置了logImpl,值配置成了JDK_LOGGING,代表的是使用JDK提供的日志系统

二、JDK日志配置

在resources目录下新建logging.properties配置文件

handlers=java.util.logging.ConsoleHandler
.level=FINER

java.util.logging.ConsoleHandler.level=ALL
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$td %1$tT.%1$tL %4$s %3$s - %5$s%6$s%n

handlers代表的是日志处理器,java.util.logging.ConsoleHandler处理器用于直接在控制台打印日志

.level代表的是全局日志级别

java.util.logging.ConsoleHandler.level设置的是处理器需要处理的日志级别

java.util.logging.ConsoleHandler.formatter设置的是处理器打印日志使用的格式化器

java.util.logging.SimpleFormatter.format设置的是处理器打印日志的格式

      1$:代表的是执行时间

      2$:代表的是调用源(Jdk Log的调用源都为Jdk14LoggingImpl)

      3$:代表的是日志名称

      4$:代表的是日志级别

      5$:代表的是日志内容

      6$:代表的是异常信息

格式的定义需要参考java.util.Formatter类

三、引入日志配置

JDK Log提供了两种引入日志配置的方式:

1、class配置

我们在cn.horse.demo下新建JdkLogConfig类

JdkLogConfig类:

package cn.horse.demo;

import java.io.IOException;
import java.io.InputStream;
import java.util.logging.LogManager;

public class JdkLogConfig {

    public JdkLogConfig() {
        try {
            InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("logging.properties");
            LogManager.getLogManager().readConfiguration(inputStream);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

在程序入口(main方法)配置系统属性:

System.setProperty("java.util.logging.config.class", "cn.horse.demo.JdkLogConfig");

或者在运行时配置VM参数:

-Djava.util.logging.config.class=cn.horse.demo.JdkLogConfig

class配置方式更加灵活,配置来源更加多样化,例如可以从Mysql、ldap等库中读取

2、file配置(不建议使用)

在程序入口(main方法)配置系统属性:

System.setProperty("java.util.logging.config.file", "日志配置文件的绝对路径(不能包含中文、空格)");

或者在运行时配置VM参数:

-Djava.util.logging.config.file=日志配置文件的绝对路径(不能包含中文、空格)

四、示例测试

测试:

这里我们查询年龄大于21岁的所有用户

StatementUtils.find("cn.horse.demo.UserInfoMapper.findByAge", 21);

执行的结果如下:

2023-08-29 16:11:27.767 详细 org.apache.ibatis.logging.LogFactory - Logging initialized using 'class org.apache.ibatis.logging.jdk14.Jdk14LoggingImpl' adapter.
2023-08-29 16:11:27.843 详细 org.apache.ibatis.logging.LogFactory - Logging initialized using 'class org.apache.ibatis.logging.jdk14.Jdk14LoggingImpl' adapter.
2023-08-29 16:11:27.854 详细 org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
2023-08-29 16:11:27.855 详细 org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
2023-08-29 16:11:27.855 详细 org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
2023-08-29 16:11:27.855 详细 org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
2023-08-29 16:11:27.900 详细 org.apache.ibatis.transaction.jdbc.JdbcTransaction - Opening JDBC Connection
2023-08-29 16:11:28.058 详细 org.apache.ibatis.datasource.pooled.PooledDataSource - Created connection 1379435698.
2023-08-29 16:11:28.059 详细 org.apache.ibatis.transaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@523884b2]
2023-08-29 16:11:28.062 详细 cn.horse.demo.UserInfoMapper.findByAge - ==>  Preparing: SELECT ID, USERNAME name, AGE FROM T_USER WHERE AGE > ? 
2023-08-29 16:11:28.094 详细 cn.horse.demo.UserInfoMapper.findByAge - ==> Parameters: 21(Integer)
2023-08-29 16:11:28.105 较详细 cn.horse.demo.UserInfoMapper.findByAge - <==    Columns: ID, name, AGE
2023-08-29 16:11:28.106 较详细 cn.horse.demo.UserInfoMapper.findByAge - <==        Row: 2, 李四, 22
2023-08-29 16:11:28.108 较详细 cn.horse.demo.UserInfoMapper.findByAge - <==        Row: 3, 王五, 24
2023-08-29 16:11:28.109 详细 cn.horse.demo.UserInfoMapper.findByAge - <==      Total: 2
2023-08-29 16:11:28.110 详细 org.apache.ibatis.transaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@523884b2]
2023-08-29 16:11:28.113 详细 org.apache.ibatis.transaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@523884b2]
2023-08-29 16:11:28.114 详细 org.apache.ibatis.datasource.pooled.PooledDataSource - Returned connection 1379435698 to pool.
{id: 2, name: 李四, age: 22}
{id: 3, name: 王五, age: 24}

在日志中我们可以看到预处理SQL语句,传递参数,返回的查询结果

2023-08-29 16:11:28.062 详细 cn.horse.demo.UserInfoMapper.findByAge - ==>  Preparing: SELECT ID, USERNAME name, AGE FROM T_USER WHERE AGE > ? 
2023-08-29 16:11:28.094 详细 cn.horse.demo.UserInfoMapper.findByAge - ==> Parameters: 21(Integer)
2023-08-29 16:11:28.105 较详细 cn.horse.demo.UserInfoMapper.findByAge - <==    Columns: ID, name, AGE
2023-08-29 16:11:28.106 较详细 cn.horse.demo.UserInfoMapper.findByAge - <==        Row: 2, 李四, 22
2023-08-29 16:11:28.108 较详细 cn.horse.demo.UserInfoMapper.findByAge - <==        Row: 3, 王五, 24
2023-08-29 16:11:28.109 详细 cn.horse.demo.UserInfoMapper.findByAge - <==      Total: 2

预处理:Preparing: SELECT ID, USERNAME name, AGE FROM T_USER WHERE AGE > ?

传递参数:Parameters: 21(Integer)

查询结果:Columns: ID, name, AGE

            Row: 2, 李四, 22

            Row: 3, 王五, 24

            Total: 2

五、日志筛选

上面的日志信息打印了全部的详细日志记录,但是我只对SQL语句执行的过程比较关心,其他不相关的信息只会造成干扰,我们需要修改日志的配置,才能输出我们想要的日志信息:

handlers=java.util.logging.ConsoleHandler
.level=INFO

cn.horse.demo.UserInfoMapper.level=FINER
java.util.logging.ConsoleHandler.level=ALL
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$td %1$tT.%1$tL %4$s %3$s - %5$s%6$s%n

将全局的日志级别设置为INFO, 将日志名称以cn.horse.demo.UserInfoMapper命名空间开头的日志级别设置为FINER

测试:

这里我们查询年龄大于21岁的所有用户

StatementUtils.find("cn.horse.demo.UserInfoMapper.findByAge", 21);

执行的结果如下:

 详细日志中只保留了SQL执行的过程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/952268.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【python爬虫】4.爬虫实操(菜品爬取)

文章目录 前言项目&#xff1a;解密吴氏私厨分析过程代码实现&#xff08;一&#xff09;获取与解析提取最小父级标签一组菜名、URL、食材写循环&#xff0c;存列表 代码实现&#xff08;二&#xff09;复习总结 前言 上一关&#xff0c;我们学习了用BeautifulSoup库解析数据和…

说说构建流批一体准实时数仓

分析&回答 基于 Hive 的离线数仓往往是企业大数据生产系统中不可缺少的一环。Hive 数仓有很高的成熟度和稳定性&#xff0c;但由于它是离线的&#xff0c;延时很大。在一些对延时要求比较高的场景&#xff0c;需要另外搭建基于 Flink 的实时数仓&#xff0c;将链路延时降低…

国标视频云服务EasyGBS国标视频平台迁移服务器后无法启动的问题解决方法

国标视频云服务EasyGBS支持设备/平台通过国标GB28181协议注册接入&#xff0c;并能实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强&#xff0c;支持将接入的视频流进行全终端、全平台分发&#xff0c;分发的视频…

即插即生产与基于技能的设计

智能制造领域的主要研究工作就是为制造领域所有事物和行为构建数字化模型。最终实现制造工厂中设备&#xff0c;软件&#xff0c;物流所有事物的互联互通。而且实现这种互联互通是便捷&#xff0c;灵活的。通俗地将就是“即插即生产”。不过&#xff0c;要实现这一目标并非易事…

【C#每日一记】常用泛型数据结构类及题单实践回顾

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

【算法题】1761. 一个图中连通三元组的最小度数

题目&#xff1a; 给你一个无向图&#xff0c;整数 n 表示图中节点的数目&#xff0c;edges 数组表示图中的边&#xff0c;其中 edges[i] [ui, vi] &#xff0c;表示 ui 和 vi 之间有一条无向边。 一个 连通三元组 指的是 三个 节点组成的集合且这三个点之间 两两 有边。 连…

Java流式编程详细介绍

文章目录 1. 流式编程介绍2. 过滤2.1 filter2.2 distinct2.3 limit2.4 sorted2.5 skip 3. 映射3.1 map3.2 flatmap 4 查找4.1 allMatch4.2 anyMatch4.3 noneMatch4.4 findFirst4.5 findAny 5. 归约6. 收集6.1 counting6.2 maxBy,minBy6.3 summingInt、summingLong、summingDoub…

zookeeper 3.8.1安装和入门使用

1、zookeeper环境搭建&#xff08;Windows单机版&#xff09; 1.1、 前提 必须安装jdk 1.8&#xff0c;配置jdk环境变量&#xff0c;步骤略 1.2、安装zookeeper 地址&#xff1a;https://zookeeper.apache.org/ 1.2.1、选择releases版本 1.2.2、下载安装包并解压 1.2.3、配…

大厂面试解码:如何准备Google, Amazon等公司的面试

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Spring Session中会将会话ID记录到标准输出流中危漏洞CVE-2023-20866

文章目录 0.前言漏洞受影响的Spring产品和版本 1.参考文档2.基础介绍描述 3.解决方案3.1. 升级版本 4.HeaderHttpSessionIdResolver 解析5. Spring Session 使用教程 0.前言 背景&#xff1a;公司项目扫描到 CVE-2023-20866&#xff1a;在Spring Session中会将会话ID记录到标准…

WevSocket(java基于spring框架实现)

一、概述 本文基于spring-boot-starter-websocket简单的完成收发信息功能&#xff0c;使用spring框架进行实现。 二、相关配置 spring:2.0.2&#xff0c;jdk:1.8.202&#xff0c;maven:3.3.9 因为spring和maven有版本匹配的要求&#xff0c;请大家注意自己的版本是否匹配 …

专线连接交换机设置 – 如何实现高效率的网络连接?

专线链接交换机设置 – 如何实现高效率的网络连接&#xff1f; 什么是专线连接交换机&#xff1f; 在现代互联网中&#xff0c;网络连接的快速和高效是至关重要的。尤其是对于需要大量数据传输和保证网络稳定性的企业和组织来说&#xff0c;专线连接交换机是一项非常重要的技…

华为云Stack的学习(四)

五、Service OM资源管理 1.Service OM简介 1.1 Service OM介绍 在华为云Stack解决方案中&#xff0c;Service OM是FusionSphere OpenStack的操作管理界面&#xff0c;是资源池&#xff08;计算、存储、网络&#xff09;以及基础云服务的管理工具。 1.2 Service OM定位 Serv…

分类算法系列②:KNN算法

目录 KNN算法 1、简介 2、原理分析 数学原理 相关公式及其过程分析 距离度量 k值选择 分类决策规则 3、API 4、⭐案例实践 4.1、分析 4.2、代码 5、K-近邻算法总结 &#x1f343;作者介绍&#xff1a;准大三网络工程专业在读&#xff0c;努力学习Java&#xff0c;涉…

Vue-关于路由规则模块的封装

路由的封装抽离 对路由的封装进行封装&#xff0c;方便main.js文件维护 首先&#xff1a; 我们需要再src文件夹中创建一个router文件夹&#xff0c;在里面在创建一个index.js文件夹。 然后&#xff1a; 我们再index.js文件夹中进行封装路由规则 import Find from /views/F…

技术深入解析与教程:网络安全技术探秘

第一章&#xff1a;引言 在当今数字化时代&#xff0c;网络安全已经成为了重要议题。随着各种信息和业务在网络上的传输与存储&#xff0c;安全问题也日益突出。本文将带您深入探讨网络安全领域中的关键技术&#xff0c;涵盖渗透测试、漏洞挖掘以及恶意软件分析等方面&#xf…

opencv android sdk 使用中的问题

Plugin with id ‘kotlin-android’ not found 在build.gradle(:app)中添加以下内容 buildscript {ext {Kotlin_Verion "1.9.10"}dependencies {classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$Kotlin_Verion"}repositories {mavenCentral()} …

SpringBoot通过@Cacheable注解实现缓存功能

目录 一、Spring从3.1开始支持Cache二、Cacheable常用属性1、value/cacheNames2、key3、condition4、unless5、keyGenerator6、sync7、cacheManager 三、整合步骤1、加入pom2、启动类加EnableCaching注解3、controller或service加Cacheable注解即可 四、代码实例五、Spring Boo…

Linux下批量创建文件夹

检测文件是否存在 这里的文件包含普通文件或者是目录文件,下面是CentOS 7环境下的测试. #include <sys/stat.h> #include <unistd.h> #include <iostream>int main() {int ret access("../lesson01/file.txt", F_OK);if (ret 0){std::cout <…

经管博士科研基础【6】:如何理解箱式图

箱形图,也叫盒须图,盒式图,boxplot。有95%的把握猜中你现在已经不太确定,这图中有几条线?每条线代表什么意思?中间的那条线代表的究竟是算数平均数还是中位数,还是众数? 再问的深点,箱形图存在的意义为何?之于数据分析的实践意义在哪里? 接下来,带你从概念开始,…