【JavaEE 进阶(五)】SpringBoot日志

news2025/2/28 6:42:39

❣博主主页: 33的博客❣
▶️文章专栏分类:JavaEE◀️
🚚我的代码仓库: 33的代码仓库🚚
🫵🫵🫵关注我带你了解更多进阶知识

在这里插入图片描述

目录

  • 1.前言
  • 2.日志使用
    • 2.1打印日志
    • 2.2 门面模式(外观模式)
    • 2.3SLF4J框架
    • 2.4日志格式说明
  • 3.@Slf4j输出日志
  • 4.总结

1.前言

⽇志对我们来说并不陌⽣, 从JavaSE部分, 我们就在使⽤ System.out.print 来打印⽇志了。通过打印⽇志来发现和定位问题, 或者根据⽇志来分析程序的运⾏过程. 在Spring的学习中, 也经常根据控制台的⽇志来分析和定位问题。那么接下来,我们就对Spring日志进行深度学习。

2.日志使用

Spring Boot在项目启动的适合默认就有日志输出:
在这里插入图片描述
那么和 System.out.println(“打印日志”);有什么不同,如下图缺少了很多信息
在这里插入图片描述
SpringBoot 内置了⽇志框架 Slf4j , 我们可以直接在程序中调⽤ Slf4j 来输出⽇志

2.1打印日志

日志打印步骤:
1.在重新中获得日志对象
2.使用日志对象输出要打印的内容

private static Logger logger= LoggerFactory.getLogger(LoggerController.class);
    @RequestMapping("t1")
    public void print(){
        logger.info("打印日志");
    }

在这里插入图片描述

2.2 门面模式(外观模式)

SLF4J是门面模式的典型应用(但不仅仅使用门面模式)。
门面模式又称为外观模式,提供了一个统一的接口,用来访问子系统的一群接口,主要特征是定义了定义了一个高层接口,让子系统更容易使用。
在这里插入图片描述
门面模式实现:
场景:回家,我们会打开各屋的灯,离开时,也会关闭各屋的灯,但是非常麻烦的,如果家里设置一个总开关,来控制整个屋的灯就会很方便。

public class FacadePatternDemo {
 public static void main(String[] args) {
 //调用门面
 LightFacade lightFacade = new LightFacade();
 lightFacade.lightOn();
 }
}
//灯的门面
class LightFacade{
 private Light livingRoomLight = new LivingRoomLight();
 private Light hallLight = new HallLight();
 private Light diningLight = new DiningLight();
 public void lightOn(){
 livingRoomLight.on();
 hallLight.on();
 diningLight.on();
 }
 public void lightOff(){
 livingRoomLight.off();
 hallLight.off();
 diningLight.off();
 }
}
//客厅灯
class LivingRoomLight implements Light{
 @Override
 public void on() {
 System.out.println("打开客厅灯");
 }
 @Override
 public void off() {
 System.out.println("关闭客厅灯");
 }
}
//走廊灯
class HallLight implements Light{
 @Override
 public void on() {
 System.out.println("打开⾛廊灯");
 }
 @Override
 public void off() {
 System.out.println("关闭⾛廊灯");
 }
 //餐厅灯
 class DiningLight implements Light{
 @Override
 public void on() {
 System.out.println("打开餐厅灯");
 }
 @Override
 public void off() {
 System.out.println("关闭餐厅灯");
 }
}

门面模式优点:
• 减少了系统的相互依赖. 实现了客户端与子系统的耦合关系, 这使得子系统的变化不会影响到调用它
的客⼾端;
• 提⾼了灵活性, 简化了客户端对子系统的使用难度, 客户端无需关心子系统的具体实现方式, 而只需要和门面对象交互即可.
• 提高了安全性. 可以灵活设定访问权限, 不在门面对象中开通方法, 就⽆法访问

2.3SLF4J框架

SLF4J就是其他日志框架的门面,SLF4J 可以理解为是提供⽇志服务的统⼀API接⼝, 并不涉及到具体的⽇志逻辑实现,日志具体的实现有log4j、JUL、logback。
不引入日志门面
常见的⽇志框架有log4J, logback等. 如果⼀个项⽬已经使用了log4j,而你依赖的另⼀个类库,假如是Apache Active MQ, 它依赖于另外⼀个日志框架logback, 那么你就需要把logback也加载进去。

存在问题:

  1. 不同⽇志框架的API接口和配置文件不同, 如果多个日志框架共存, 那么不得不维护多套配置⽂件(这个配置⽂件是指用户自定义的配置文件).
  2. 如果要更换日志框架, 应⽤程序将不得不修改代码, 并且修改过程中可能会存在⼀些代码冲突.
  3. 如果引入的第三方框架, 使用了多套, 那就不得不维护多套配置.

引入日志门面
引入日志门志框架之后, 应用程序和日志框架(框架的具体实现)之间有了统⼀的API接⼝(门面日志框架实现), 此时应用程序只需要维护⼀套⽇志⽂件配置, 且当底层实现框架改变时, 也不需要更改应用程序代码。

2.4日志格式说明

在这里插入图片描述
⽇志级别代表着⽇志信息对应问题的严重性,日志级别有6种:FATAL、ERROR、WARN、INFO、DEBUG、TRACE。

• FATAL: 致命信息,表⽰需要⽴即被处理的系统级错误.
• ERROR: 错误信息, 级别较⾼的错误⽇志信息, 但仍然不影响系统的继续运⾏.
• WARN: 警告信息, 不影响使⽤, 但需要注意的问题
• INFO: 普通信息, ⽤于记录应⽤程序正常运⾏时的⼀些信息, 例如系统启动完成、请求处理完成等.
• DEBUG: 调试信息, 需要调试时候的关键信息打印.
• TRACE: 追踪信息, ⽐DEBUG更细粒度的信息事件(除⾮有特殊⽤意,否则请使⽤DEBUG级别替代)
打印不=不同级别的日志:

public String printLog() {
 logger.trace("================= trace ===============");
 logger.debug("================= debug ===============");
 logger.info("================= info ===============");
 logger.warn("================= warn ===============");
 logger.error("================= error ===============");
 return "打印不同级别的⽇志" ;
}

日志打印结果:
在这里插入图片描述
结果中发现日志中只出现了info,warn,erro级别的日志。这个与日志级别的配置有关,日志的输出级别默认是info,所以只会打印⼤于等于此级别的⽇志,也就是info, warn和error。
如果要修改日志的打印,可以通过配置文件进行修改:

logging.level.root: debug

在打印日志·的时候一般是输出在控制台上,然而在线上环境,我们需要把日志保存起来,一遍问题出现以后追溯问题。
日志持久化存储:

logging.file.name: spring-blog.log

在这里插入图片描述
配置日志分割:

// 分割后的⽇志⽂件名为:⽇志名.⽇期.索引
logging.logback.rollingpolicy.file-name-pattern=${LOG_FILE}.%d{yyyy-MM-dd}.%i
//按照1kb分割
 logging.logback.rollingpolicy.max-file-size=1KB

3.@Slf4j输出日志

每次都使⽤LoggerFactory.getLogger(xxx.class) 很繁琐,且每个类都添加⼀遍,lombok给我们提供了⼀种更简单的⽅式。
1.添加lombok框架
2.使用@Slf4j注解
添加lombok依赖:

<dependency>
 <groupId>org.projectlombok</groupId>
 <artifactId>lombok</artifactId>
 <optional>true</optional>
 </dependency>

输出日志

@Slf4j
 @RestController
 public class LogController {
 public void log(){
 log.info("-------------要输出⽇志的内容----------------");
 }
 }

4.总结

⽇志是程序中的重要组成部分,使⽤⽇志可以快速的发现和定位问题,SpringBoot内容了⽇志框架,默认情况下使⽤的是info⽇志级别将⽇志输出到控制台的,我们可以通过lombok提供的@Slf4j 注解和log 对象快速的打印⾃定义⽇志.

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

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

相关文章

MySQL----配置主从复制

环境 master(CtenOS7)&#xff1a;192.168.200.131 ----ifconfig查看->ens33->inet slave(win10)&#xff1a;192.168.250.52 ----ipconfig查看->无线局域网适配器 WLAN:-> IPv4 地址 保证两个环境中MySQL版本一致 网络互通 win&#xff1a;ping 192.168.200.13…

NL2SQL进阶系列(1):DB-GPT-Hub、SQLcoder、Text2SQL开源应用实践详解

1. MindSQL(库) MindSQL 是一个 Python RAG&#xff08;检索增强生成&#xff09;库&#xff0c;旨在仅使用几行代码来简化用户与其数据库之间的交互。 MindSQL 与 PostgreSQL、MySQL、SQLite 等知名数据库无缝集成&#xff0c;还通过扩展核心类&#xff0c;将其功能扩展到 Sn…

【五子棋】C语言教程

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

webhook-k8s API和apimachinery版本高于Client-go

1. 问题 使用go mod tidy 存在丢弃的版本 go: downloading github.com/josharian/intern v1.0.0 go: finding module for package k8s.io/api/flowcontrol/v1alpha1 go: simple-webhook/types importsk8s.io/client-go/rest tested byk8s.io/client-go/rest.test importsk8s.…

大数据-数据分析初步学习,待补充

参考视频&#xff1a;数据分析只需3小时从入门到进阶&#xff08;up亲身实践&#xff09;_哔哩哔哩_bilibili 数据指标&#xff1a; 对当前业务有参考价值的统计数据 分类&#xff1a;用户数据&#xff0c;业务数据&#xff0c;行为数据 用户数据 存量&#xff1a; DAU&#…

基于Vue3.0 Node.js 的 大文件切片上传、秒传、断点续传实现方案梳理

✨&#x1f4bb; 在处理大文件上传时&#xff0c;切片上传是提高效率与用户体验的关键技术之一。下面将详细介绍如何在前端利用Vue框架与Node.js后端配合&#xff0c;实现这一功能。 &#x1f446;&#x1f3fb;大体流程 &#x1f446;&#x1f3fb;一、文件切片上传 通过文件…

43、基于神经网络拟合函数的体脂估计(matlab)

1、神经网络拟合函数的原理及流程 神经网络拟合函数是一种基于人工神经元之间相互连接的模型&#xff0c;用来拟合复杂的非线性函数关系。其原理是通过多层次的神经元网络&#xff0c;每一层神经元通过激活函数将输入信号加权求和后输出&#xff0c;经过多次迭代优化权值&…

Java 集合框架详谈及代码分析(Iterable->Collection->List、Set->各接口实现类、Map->各接口实现类)

目录 Java 集合框架详谈及代码分析&#xff08;Iterable->Collection->List、Set->各接口实现类、Map->各接口实现类&#xff09;1、集合概述1-1&#xff1a;Java 集合概述1-2&#xff1a;List、Set、Map 三者的区别&#xff1f;1-3&#xff1a;集合框架底层数据结…

python电灯开关 青少年编程电子学会python编程等级考试三级真题解析2021年12月

python电灯开关 2021年12月 python编程等级考试级编程题 一、题目要求 1、编程实现 n个灯排成一排&#xff0c;开始时都是关着的。现进行如下操作: 所有电灯的按钮按动一次;所有编号为2的倍数的电灯按钮按动一次;所有编号为3的倍数的电灯的按钮按动一次: …所有编号为n-1的…

LeetCode 算法:删除链表的倒数第 N 个结点 c++

原题链接&#x1f517;&#xff1a;删除链表的倒数第 N 个结点 难度&#xff1a;中等⭐️⭐️ 题目 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a…

详细分析Element Plus的el-pagination基本知识(附Demo)

目录 前言1. 基本知识2. Demo3. 实战 前言 需求&#xff1a;从无到有做一个分页并且附带分页的导入导出增删改查等功能 前提一定是要先有分页&#xff0c;作为全栈玩家&#xff0c;先在前端部署一个分页的列表 相关后续的功能&#xff0c;是Java&#xff0c;推荐阅读&#x…

rockchip linux sdk指定编译配置文件

SDK&#xff1a;rk3568_linux4.19_V1.4.0 硬件平台&#xff1a;RK3566 一、指定板级配置文件 板级配置文件在<SDK>/device/rockchip/rk3566_rk3568目录下。 1、方法1 ./build.sh后⾯加上板级配置⽂件&#xff0c;例如&#xff1a; ./build.sh /device/rockchip/rk3…

STM32微控制器库指南:函数特性、应用范围与实践

在嵌入式系统的设计和开发中&#xff0c;STM32系列微控制器因其卓越的处理能力和多样的外设选项而广受推崇。STM32库函数作为开发流程中不可或缺的工具&#xff0c;扮演着至关重要的角色。本文将详细阐述STM32库函数的主要特性、应用场景及其在实际开发中的应用实例。 什么是ST…

Golang | Leetcode Golang题解之第168题Excel表列名称

题目&#xff1a; 题解&#xff1a; func convertToTitle(columnNumber int) string {ans : []byte{}for columnNumber > 0 {columnNumber--ans append(ans, Abyte(columnNumber%26))columnNumber / 26}for i, n : 0, len(ans); i < n/2; i {ans[i], ans[n-1-i] ans[n…

JavaScript基础部分知识点总结(Part3)

函数的概念 1. 函数的概念 在JS 里面&#xff0c;可能会定义非常多的相同代码或者功能相似的代码&#xff0c;这些代码可能需要大量重复使用。虽然for循环语句也能实现一些简单的重复操作&#xff0c;但是比较具有局限性&#xff0c;此时我们就可以使用JS 中的函数。函数&…

RabbitMQ实践——交换器(Exchange)和绑定(Banding)

大纲 direct型交换器默认交换器命名交换器 fanout型交换器topic型交换器headers型交换器 RabbitMQ在概念上由三部分组成&#xff1a; 交换器&#xff08;Exchange&#xff09;&#xff1a;负责接收消息发布者发布消息的结构&#xff0c;同时它会根据“绑定关系”&#xff08;Ba…

PySide(PyQt)的特殊按钮(互锁、自锁、独占模式)

界面图&#xff1a; Qt Designer中创建窗口&#xff0c;放置一个QGroupBox&#xff0c;命名为btnStation&#xff0c;这就是自定义的按钮站&#xff0c;按钮站里放置6个按钮。自锁按钮相当于电器中的自锁功能的按钮&#xff0c;每按一次状态反转并保持不变。独占按钮也是自锁功…

使用asyncua模块的call_method方法调用OPC UA的Server端方法报错:asyncio.exceptions.TimeoutError

使用asyncua模块的call_method方法调用OPC UA的Server端方法报错&#xff1a;asyncio.exceptions.TimeoutError 报错信息如下&#xff1a; Traceback (most recent call last): asyncio.run(main()) File “D:\miniconda3\envs\py31013\lib\asyncio\runners.py”, line 44, in…

Python酷库之旅-比翼双飞情侣库(17)

目录 一、xlwt库的由来 1、背景和需求 2、项目启动 3、功能特点 4、版本兼容性 5、与其他库的关系 6、示例和应用 7、发展历史 二、xlwt库优缺点 1、优点 1-1、简单易用 1-2、功能丰富 1-3、兼容旧版Excel 1-4、社区支持 1-5、稳定性 2、缺点 2-1、不支持.xls…

什么是无限铸币攻击?它是如何运作的?

一、无限铸币攻击解释 无限铸币攻击是指攻击者操纵合约代码不断铸造超出授权供应限制的新代币。 这种黑客行为在去中心化金融 (DeFi) 协议中最为常见。这种攻击通过创建无限数量的代币来损害加密货币或代币的完整性和价值。 例如&#xff0c;一名黑客利用了 Paid 网络的智能…