【SpringBoot系列】SpringBoot日志配置
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
- 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
- 导航
- 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
- 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
- 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
- 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
- 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨
博客目录
- 一.基础介绍
- 1.日志顺序
- 2.日志原理
- 二.日志配置
- 1.自定义 log
- 2.配置 log 输出
- 3.设置不打印
- 4.配置文件
- 三.日志文件
- 1.日志配置方式一
- 2.日志配置方式二
一.基础介绍
1.日志顺序
日志级别顺序:
DEBUG < INFO < WARN < ERROR < FATAL
SpringBoot 中使用 info 日志级别打印 mybatis SQL 语句,在 Spring Cloud 项目中,生产环境需要打印 mybatis 的 SQL 语句日志,但是 mybatis 打印的 SQL 的默认日志级别是 [debug],如果生产环境想看到 SQL 语句,就必须开启[debug] 级别的日志打印,这样做 debug 日志量过大,显然不可行。
**解决思路:**Spring Boot 中通过 logback 打印 mybatis 的 SQL 语句日志,并自定义日志输出实现将 SQL 语句 [debug] 日志级别上升到 [info] 日志级别。
2.日志原理
常用的 mybatis 日志输出是由 org.apache.ibatis.logging.stdout.StdOutImpl 控制的。
根据 StdOutImpl.java 可看出日志都是 System.out.println(s); 的控制台输出,配置及源码如下
#application.xml
mybatis:type-aliases-package: com.jiafupeng.mappermapper-locations: classpath:mapper*.xmlconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 控制台输出日志
public class StdOutImpl implements Log {public StdOutImpl(String clazz) {}@Overridepublic boolean isDebugEnabled() {return true;}@Overridepublic boolean isTraceEnabled() {return true;}@Overridepublic void error(String s, Throwable e) {System.err.println(s);e.printStackTrace(System.err);}@Overridepublic void error(String s) {System.err.println(s);}@Overridepublic void debug(String s) {System.out.println(s);}@Overridepublic void trace(String s) {System.out.println(s);}@Overridepublic void warn(String s) {System.out.println(s);}
}
二.日志配置
1.自定义 log
要想改变 mybatis SQL 语句输出内容级别,则只需自定义 Log 实现类,重写 mybatis sql 打印方式及级别。代码如下
#application.xml
mybatis:type-aliases-package: com.jiafupeng.mappermapper-locations: classpath:mapper*.xmlconfiguration:log-impl: com.jiafupeng.util.MySlf4jImpl # mybatis自定义日志输出实现类 并将[debug]日志输出成[info]日志
@Slf4j
public class MySlf4jImpl implements Log {public MySlf4jImpl(String clazz) {}@Overridepublic boolean isDebugEnabled() {return log.isInfoEnabled();}@Overridepublic void debug(String s) {log.info(s);}
}
2.配置 log 输出
指定 logback 的日志级别为 info,也可在 [info] 级别日志中查看 mybatis 的 sql 语句。
#logback.xml
<!-- 日志输出级别 -->
<root level="info"><appender-ref ref="FILE-INFO"/>
</root><!-- 如果想将mybatis-sql[info]日志单独输出到一个文件中,就加上如下配置 -->
<!-- <logger name="com.jiafupeng.util.MySlf4jImpl" level="info" additivity="false">-->
<!-- <appender-ref ref="FILE-SQL"/>-->
<!-- </logger>-->
3.设置不打印
生产环境如果不想打印 mybatis sql 则注释掉打印实现类即可,或者使用 NoLoggingImpl.java 作为实现类,具体看源码。
#日志配置
mybatis:type-aliases-package: com.jiafupeng.mappermapper-locations: classpath:mapper*.xml
#或
mybatis:type-aliases-package: com.jiafupeng.mappermapper-locations: classpath:mapper*.xmlconfiguration:log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl # 无日志(默认有debug日志)
4.配置文件
#logback日志配置
logging:config: classpath:logback-spring.xmllevel:root: infospringfox: error #spring的日志检查级别
三.日志文件
1.日志配置方式一
logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration><property name="log.charset" value="utf-8"/><property name="console.log.pattern"value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %blue(%msg%n)"/><property name="file.log.pattern"value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"/><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>${console.log.pattern}</pattern><charset>${log.charset}</charset></encoder></appender><appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>logs/xxx-dsc-xxx-insight-ai-replenish.log</file><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>logs/xxx-dsc-xx-xxx-ai-replenish-%d{yyyy-MM-dd}.%i.log</fileNamePattern><maxFileSize>128MB</maxFileSize><maxHistory>30</maxHistory><totalSizeCap>20GB</totalSizeCap></rollingPolicy><encoder><pattern>${file.log.pattern}</pattern><charset>${log.charset}</charset></encoder></appender><logger name="com.xxx.dsc.xxx.xx.mapper" level="info" additivity="false"><appender-ref ref="STDOUT"/></logger><root level="info"><appender-ref ref="STDOUT"/><appender-ref ref="ROLLING"/></root>
</configuration>
2.日志配置方式二
方式二与方式一的区别在于可以根据不同的环境添加对应的日志存储和打印策略。
<?xml version="1.0" encoding="UTF-8"?>
<configuration><property name="log.charset" value="utf-8"/><property name="console.log.pattern"value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %blue(%msg%n)"/><property name="file.log.pattern"value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"/><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>${console.log.pattern}</pattern><charset>${log.charset}</charset></encoder></appender><springProfile name="dev,test,local"><property name="log.dir" value="./logs/"/><property name="file.log.pattern"value="%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX} %-5level [%thread] %logger{36} - %msg%n"/><appender name="SYSTEM_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.dir}system/%d.log</fileNamePattern> </rollingPolicy><encoder><pattern>${file.log.pattern}</pattern><charset>${log.charset}</charset></encoder><append>true</append></appender><appender name="SQL_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.dir}/sql/%d.log</fileNamePattern> </rollingPolicy><encoder><pattern>${file.log.pattern}</pattern><charset>${log.charset}</charset></encoder><append>true</append></appender></springProfile><!-- 如果是本地环境,则设置控制台打印--><springProfile name="test,uat"><logger name="com.kwan.springbootkwan.mapper" level="DEBUG" additivity="false"><appender-ref ref="STDOUT"/></logger><root level="INFO"><appender-ref ref="STDOUT"/></root></springProfile><!-- 如果是dev和test环境,则不设置控制台打印,将日志保存到不同的文件--><springProfile name="dev"><logger name="com.kwan.springbootkwan.mapper" level="DEBUG" additivity="false"><appender-ref ref="SQL_LOG"/></logger><root level="INFO"><appender-ref ref="SYSTEM_LOG"/></root></springProfile>
</configuration>
觉得有用的话点个赞
👍🏻呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
相关文章:
【SpringBoot系列】SpringBoot日志配置
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
庖丁解牛:NIO核心概念与机制详解 06 _ 连网和异步 I/O
文章目录 Pre概述异步 I/OSelectors打开一个 ServerSocketChannel选择键内部循环监听新连接接受新的连接删除处理过的 SelectionKey传入的 I/O回到主循环 Pre 庖丁解牛:NIO核心概念与机制详解 01 庖丁解牛:NIO核心概念与机制详解 02 _ 缓冲区的细节实现…...
域控操作五:统一熄屏睡眠时间
直接看图路径,我只设置了熄屏,如果要睡眠就下面那个启用设置时间...
2023APMCM亚太杯数学建模选题建议及初步思路
大家好呀,亚太杯数学建模开始了,来说一下初步的选题建议吧: 首先定下主基调,本次亚太杯推荐选择B题。 C题如果想做好,搜集数据难度并不低,并且模型比较简单,此外目前选择的人数过多,…...
ORA-28003: password verification for the specified password failed,取消oracl密码复杂度
自己在测试环境想要使自己的Oracle数据库用户使用简单的密码方便测试,结果指定密码的密码验证失败 SQL> alter user zzw identified by zzw; alter user zzw identified by zzw * ERROR at line 1: ORA-28003: password verification for the specified password…...
【DevOps】Git 图文详解(九):工作中的 Git 实践
本系列包含: Git 图文详解(一):简介及基础概念Git 图文详解(二):Git 安装及配置Git 图文详解(三):常用的 Git GUIGit 图文详解(四)&a…...
外贸自建站服务器怎么选?网站搭建的工具?
外贸自建站服务器用哪个好?如何选海洋建站的服务器? 外贸自建站是企业拓展海外市场的重要手段之一。而在这个过程中,选择一个适合的服务器对于网站的稳定运行和优化至关重要。海洋建站将为您介绍如何选择适合的外贸自建站服务器。 外贸自建…...
010 OpenCV中的4种平滑滤波
目录 一、环境 二、平滑滤波 2.1、均值滤波 2.2、高斯滤波 2.3、中值滤波 2.4、双边滤波 三、完整代码 一、环境 本文使用环境为: Windows10Python 3.9.17opencv-python 4.8.0.74 二、平滑滤波 2.1、均值滤波 在OpenCV库中,blur函数是一种简…...
Oracle-客户端连接报错ORA-12545问题
问题背景: 用户在客户端服务器通过sqlplus通过scan ip登陆访问数据库时,偶尔会出现连接报错ORA-12545: Connect failed because target host or object does not exist的情况。 问题分析: 首先,登陆到连接有问题的客户端数据库上,…...
Linux中的进程程序替换
Linux中的进程程序替换 1. 替换原理2. 替换函数3. 函数解释4. 命名理解程序替换的意义 1. 替换原理 替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的…...
MIT6.824-Raft笔记:脑裂、Majority Vote(过半投票/过半选举)
本部分主要是问题引入,以及给出一个解决方案 1 脑裂(Split Brain) replication system的共同点:单点 前面几个容错特性(fault-tolerant)的系统,有一个共同的特点。 MapReduce复制了计算&…...
vuex中的常用属性有哪些?
在 Vuex 中,有一些常用的属性可以帮助你管理应用程序的状态。这些属性包括 state、getters、mutations 和 actions。 state: 用于存储应用程序的状态数据,是 Vuex 存储数据的地方。当应用程序中的多个组件需要共享状态时,就可以将这些共享的状…...
oracle面试相关的,Oracle基本操作的SQL命令
文章目录 数据库-Oracle〇、Oracle用户管理一、Oracle数据库操作二、Oracle表操作1、创建表2、删除表3、重命名表4、增加字段5、修改字段6、重名字段7、删除字段8、添加主键9、删除主键10、创建索引11、删除索引12、创建视图13、删除视图 三、Oracle操作数据1、数据查询2、插入…...
Ubuntu 23.10 服务器版本 ifconfig 查不到网卡 ip(已解决)
文章目录 1、问题描述2、 解决方案 1、问题描述 服务器:ubuntu 23.10 经常会遇到虚拟机添加仅主机网卡后,通过 ifconfig 无法获取其网卡 ip 2、 解决方案 修改网卡配置文件: # 进入网卡配置文件目录 cd /etc/netplan # 备份原始文件 cp …...
如何实现图片轮播(python版)
为了实现图片自动轮播,我们可以使用Python编写一个简单的脚本。首先,我们需要安装一个名为Pillow的库来处理图片。在命令行中输入以下命令进行安装: pip install Pillow 接下来,我们编写一个名为image_slideshow.py的脚本&#x…...
【每日一题】1410. HTML实体解析器-2023.11.23
题目: 1410. HTML 实体解析器 「HTML 实体解析器」 是一种特殊的解析器,它将 HTML 代码作为输入,并用字符本身替换掉所有这些特殊的字符实体。 HTML 里这些特殊字符和它们对应的字符实体包括: 双引号:字符实体为 &…...
Python爬虫-获取汽车之家新车优惠价
前言 本文是该专栏的第10篇,后面会持续分享python爬虫案例干货,记得关注。 本文以汽车之家新车优惠价为例,获取各车型的优惠价,示例图如下: 地址:aHR0cHM6Ly9idXkuYXV0b2hvbWUuY29tLmNuLzAvMC8wLzQyMDAwMC80MjAxMDAvMC0wLTAtMS5odG1sI3B2YXJlYWlkPTIxMTMxOTU= 需求:获…...
搜索引擎---项目测试
11111...
揭秘 Go 中的模板:一份全面而广泛的指南
关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等,您的关注将是我的更新动力! 本全面指南将带领您进入Go模板的复杂世界,为您提供使用这个宝贵工具的知识和专业技能。在探索过程中,您将…...
使用Python的turtle模块绘制钢铁侠图案
1.1引言: 在Python中,turtle模块是一个非常有趣且强大的工具,它允许我们以一个可视化和互动的方式学习编程。在本博客中,我们将使用turtle模块来绘制钢铁侠的图案。通过调用各种命令,我们可以引导turtle绘制出指定的图…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...

