【MyBatis】MyBatis的日志实现

目录

一、日志演变

二、MyBatis中实现日志管理

1.导入pom依赖

2.添加logback配置文件

3.日志打印

三、MyBatis日志技术实现原理

3.1 初始化

3.2 具体实现类

3.3 自己模拟实现mybaits的日志实现

四、架构系统如何考虑日志


一、日志演变

JDK 1.4之前 没有任何的日志框架,直接用系统输出用作日志打印。

System.out.println("")

需求痛点:

  • 将日志按照级别输入,按照包或者类来输入。
  • 将日志输入到文件中,能不能按照日期或者文件大小来进行归档,记录日志同时发送邮件给开发人员
  • 自定义格式,让日志更美观
  • 性能

基于以上需求,市面上开发出了各种日志框架,市面上的日志框架有:

JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j(日志门面 ,集成其他框架,不实现日志功能)....

日志门面 (日志的抽象层)

日志实现

JCL(Jakarta Commons Logging) SLF4j(Simple Logging Facade for Java) jboss-logging

Log4j JUL(java.util.logging) Log4j2 Logback

左边选一个门面(抽象层)、右边来选一个实现;

日志门面: SLF4J; 官方文档: SLF4J

日志实现:Logback; 中文文档: 全球信誉最好的网投平台(中国)官方网站

二、MyBatis中实现日志管理

在MyBatis中也可以集成日志框架。步骤如下:

1.导入pom依赖

<!-- log start -->
<!-- 日志门面依赖 -->
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.30</version>
</dependency>
<!-- 具体实现日志框架 -->
<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version>
</dependency>
<!-- log end -->

2.添加logback配置文件

<configuration><!--appender 追加器   日志以哪种方式进行输出name 取个名字class 不同实现类会输出到不同地方ch.qos.logback.core.ConsoleAppender 输出到控制台--><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><!-- 格式 --><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{100} - %msg%n</pattern></encoder></appender><!--cn.tulingxueyuan.mapper--><!--控制跟细粒度的日志级别  根据包\根据类--><logger name="cn.tulingxueyuan.mapper" level="debug"></logger><!-- org.apache.ibatis.transaction --><!--控制所有的日志级别--><root level="error"><!-- 将当前日志级别输出到哪个追加器上面 --><appender-ref ref="STDOUT" /></root>
</configuration>

3.日志打印

Logger LOGGER= LoggerFactory.getLogger(this.getClass());
/*** 日志级别* TRACE < DEBUG < INFO < WARN < ERROR。* 1        2       3      4       5*/@Test
public  void test02(){LOGGER.trace("跟踪级别");LOGGER.debug("调试级别");LOGGER.info("信息级别");LOGGER.warn("警告级别");LOGGER.error("异常级别");
}

三、MyBatis日志技术实现原理

MyBatis的日志实现相对来说是比较简单的,下面我们直接去分析源码。

MyBatis的日志对象使用过LogFactory实例化创建的。

3.1 初始化

首先我们看LogFactory类中的静态代码块,很明显,这是一个按照顺序去尝试创建各种日志技术的对象的逻辑。由此可见,MyBatis的日志选择也是存在着一个优先级顺序的,优先级如下:

  1. slf4j
  2. jcl
  3. log4j2
  4. log4j
  5. jul
  6. 不使用日志

所以MyBatisSpring Boot一样,都是优先使用slf4j去管理日志,Spring就是优先使用log4j2来打印日志。这是这三种框架日志选择规则的不同之处

下面再来看tryImplementation方法源码

org.apache.ibatis.logging.LogFactory

private static void tryImplementation(Runnable runnable) {if (logConstructor == null) {try {runnable.run();} catch (Throwable t) {// ignore}}
}

关键代码 if (logConstructor == null),没有找到实现则接触该方法,继续找是否存在下一个日志技术。

3.2 具体实现类

MyBatis提供很多日志的实现类,用来记录日志,取决于初始化的时候load到的class

上图红色箭头可以看到JakartaCommonsLoggingImpl中引用了jcl 的类,如果在初始化的时候load到类为JakartaCommonsLoggingImpl,那么则使用jcl 去实现日志记录,但是也是顺序的,顺序参考上面讲过的源码。

3.3 自己模拟实现mybaits的日志实现

mybatis的官网关于日志的介绍

定义org.apache.ibatis.session.Configuration

参考org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl

分析为什么jcl不记录日志,修改代码

四、架构系统如何考虑日志

old:jcl + log4j

new:slf4j + jul


相关文章:【MyBatis】MyBatis的介绍和基本使用
                  【Spring】通用日志框架和spring 5的日志技术新特性

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

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

相关文章

vue 移动端弹窗带滚动效果 滚动到底的时候弹窗下的页面会跟着滑动

<template><div class"wrap" :style"dynamicStyle"><!--dynamicStyle主要是介个 通过computed设置postion的值 弹窗的时候设置为fixed 关闭弹窗的时候设置为unset--><div class"banner-wrap"><img src"/assets/…

16.Python多线程

如果想让我们的程序同时执行多个任务&#xff0c;就需要使用多线程技术了 。到目前为止&#xff0c;我们编写的程序都是单线程的&#xff0c;在运行时一次只能执行 一个任务。 1 线程相关的知识 1.1 进程 一个进程就是一个正在执行的程序&#xff0c;每一个进程都有自己独立…

sklearn主成分分析PCA

文章目录 基本原理PCA类图像降维与恢复 基本原理 PCA&#xff0c;即主成分分析(Principal components analysis)&#xff0c;顾名思义就是把矩阵分解成简单的组分进行研究&#xff0c;而拆解矩阵的主要工具是线性变换&#xff0c;具体形式则是奇异值分解。 设有 m m m个 n n …

Rust---有关介绍

目录 Rust---有关介绍变量的操作Rust 数值库&#xff1a;num某些基础数据类型序列(Range)字符类型单元类型 发散函数表达式&#xff08;&#xff01; 语句&#xff09; Rust—有关介绍 得益于各种零开销抽象、深入到底层的优化潜力、优质的标准库和第三方库实现&#xff0c;Ru…

蚁剑流量分析

蚁剑流量分析 在靶机上面上传一个一句话木马&#xff0c;并使用蚁剑连接&#xff0c;进行抓包, 一句话木马内容 <?php eval($_POST[1]); defalut编码器 在使用蚁剑连接的时候使用default编码器 连接之后进行的操作行为是查看当前目录(/var/www/html)下的文件&#xff0…

数据结构进阶篇 之 【插入排序】详细讲解(直接插入排序,希尔排序)

千万不要因为一件事不会做而失去信心&#xff0c;你又不是只有这一件事不会&#xff0c;你还有很多呢 一、插入排序 1.直接插入排序 InsertSort 1.1 基本思想 1.2 实现原理 1.3 代码实现 1.4 直接插入排序的特性总结 2.希尔排序 ShellSort 2.1 基本思想 2.2 实现原理 …

Sora 基础作品之 DiT:Scalable Diffusion Models with Transformer

Paper name Scalable Diffusion Models with Transformers (DiT) Paper Reading Note Paper URL: https://arxiv.org/abs/2212.09748 Project URL: https://www.wpeebles.com/DiT.html Code URL: https://github.com/facebookresearch/DiT TL;DR 2022 年 UC Berkeley 出…

罗克韦尔AB的PLC协议和西门子PLC协议转换网关

下面是罗克韦尔(AB)的Compact系列的PLC与西门子S7-1500之间的通讯的配置&#xff0c;实现AB的标签数组与西门子DB数据块之间通讯。 首先在AB的PLC内建立输入和输出数组&#xff0c;用于接收和写入S7-1500的PLC数据&#xff0c;名称分别是IN_INT16、OUT_OUT16&#xff0c;输入80…

为“自研”的KV数据库编写JDBC驱动

一觉醒来&#xff0c;受到梦的启发&#xff0c;自研了一套K/V数据库系统&#xff0c;因为"客户"一直催促我提供数据库的JDBC驱动&#xff0c;无奈之下&#xff0c;只好花费一个上午的时间为用户编写一个。 我们知道&#xff0c;JDBC只定义一系列的接口, 具体的实现需…

WeekPaper:GraphTranslator将知识图谱与大模型对齐

GraphTranslator: 将图模型与大型语言模型对齐&#xff0c;用于开放式任务。 将基于图的结构和信息与大型语言模型的能力整合在一起&#xff0c;以提高在涉及复杂和多样数据的任务中的性能。其目标是利用图模型和大型语言模型的优势&#xff0c;解决需要处理和理解结构化和非结…

Python深度学习034:cuda的环境如何配置

文章目录 1.安装nvidia cuda驱动CMD中看一下cuda版本:下载并安装cuda驱动2.创建虚拟环境并安装pytorch的torch_cuda3.测试附录1.安装nvidia cuda驱动 CMD中看一下cuda版本: 注意: 红框的cuda版本,是你的显卡能装的最高的cuda版本,所以可以选择低于它的版本。比如我的是11…

Prometheus+grafana环境搭建redis(docker+二进制两种方式安装)(四)

由于所有组件写一篇幅过长&#xff0c;所以每个组件分一篇方便查看&#xff0c;前三篇 Prometheusgrafana环境搭建方法及流程两种方式(docker和源码包)(一)-CSDN博客 Prometheusgrafana环境搭建rabbitmq(docker二进制两种方式安装)(二)-CSDN博客 Prometheusgrafana环境搭建m…

HarmonyOS实战开发-一次开发,多端部署-视频应用

介绍 随着智能设备类型的不断丰富&#xff0c;用户可以在不同的设备上享受同样的服务&#xff0c;但由于设备形态不尽相同&#xff0c;开发者往往需要针对具体设备修改或重构代码&#xff0c;以实现功能完整性和界面美观性的统一。OpenHarmony为开发者提供了“一次开发&#x…

Ubuntu20.04安装MatlabR2018a

一、安装包 安装包下载链接 提取码&#xff1a;kve2 网上相关教程很多&#xff0c;此处仅作为安装软件记录&#xff0c;方便后续软件重装&#xff0c;大家按需取用。 二、安装 1. 相关文件一览 下载并解压文件后&#xff0c;如下图所示&#xff1a; 2. 挂载镜像并安装 2…

python实战之宝塔部署flask项目

一. 项目 这个demo只是提供了简单的几个api接口, 并没有前端页面 # -*- coding: utf-8 -*- import flask as fk from flask import jsonify, requestapp fk.Flask(__name__)app.route(/api/hello, methods[GET]) def get_data():return hello world# 假设我们要提供一个获取用…

rabbitmq死信交换机,死信队列使用

背景 对于核心业务需要保证消息必须正常消费&#xff0c;就必须考虑消费失败的场景&#xff0c;rabbitmq提供了以下三种消费失败处理机制 直接reject&#xff0c;丢弃消息&#xff08;默认&#xff09;返回nack&#xff0c;消息重新入队列将失败消息投递到指定的交换机 对于核…

每日一题 --- 右旋字符串[卡码][Go]

右旋字符串 题目&#xff1a;55. 右旋字符串&#xff08;第八期模拟笔试&#xff09; (kamacoder.com) 题目描述 字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k&#xff0c;请编写一个函数&#xff0c;将字符串中的后面…

HarmonyOS 应用开发之同步任务开发指导 (TaskPool和Worker)

同步任务是指在多个线程之间协调执行的任务&#xff0c;其目的是确保多个任务按照一定的顺序和规则执行&#xff0c;例如使用锁来防止数据竞争。 同步任务的实现需要考虑多个线程之间的协作和同步&#xff0c;以确保数据的正确性和程序的正确执行。 由于TaskPool偏向于单个独…

scRNA+bulk+MR:动脉粥样硬化五个GEO数据集+GWAS,工作量十分到位

今天给大家分享一篇JCR一区&#xff0c;单细胞bulkMR的文章&#xff1a;An integrative analysis of single-cell and bulk transcriptome and bidirectional mendelian randomization analysis identified C1Q as a novel stimulated risk gene for Atherosclerosis 标题&…

rtph264depay插件分析笔记

1、rtp协议头 2、rtp可以基于TCP或者UDP 其中基于TCP需要加4个字节的RTP标志 3、rtph264depay定义解析函数gst_rtp_h264_depay_process&#xff0c;通过RFC 3984文档实现。 static void gst_rtp_h264_depay_class_init (GstRtpH264DepayClass * klass) {GObjectClass *gobject…