当前位置: 首页 > news >正文

Spring 日志文件

Spring 日志文件


文章目录

  • Spring 日志文件
  • 日志有什么用?
  • 日志怎么用?
  • 自定义日志
    • 在程序中获取日志对象
    • 常用日志框架说明
    • 使用日志对象打印日志
    • 日志格式说明
  • 日志级别
    • 日志级别有啥用
    • 日志级别分类和使用
    • 日志持久化保存
  • 更简单的日志输出——lombok
    • lombok更多注解说明


日志有什么用?

日志是程序的重要组成部分,想象一下,如果程序报错了,不让你打开控制台看日志,那么你能找到报错的原因吗?

答案是否定的,写程序不是买彩票,不能完全靠猜,因此日志对于我们来说,最主要的用途就是排除和定位问题

除了发现和定位问题之外,我们还可以通过日志实现以下功能:

  • 记录用户登录日志,方便分析用户是正常登录还是恶意破解用户
  • 记录系统的操作日志,方便数据恢复和定位操作人
  • 记录程序的执行时间,方便为以后优化程序提供数据支持

以上这些都是日志提供的非常实用的功能

日志怎么用?

Spring项目在启动的时候,默认就有日志输出:
在这里插入图片描述
Spring Boot 输出的控制台日志信息引发三个问题:

  • Spring Boot 内置日志框架
  • 开发者如何在程序中自定义打印日志
  • 如何将默认打印在控制台且无法保存的日志永久保存

自定义日志

自定义日志实现步骤:

  1. 在程序中获取日志对象
  2. 使用日志对象相关语法打印输出需要内容

在程序中获取日志对象

在这里插入图片描述
日志工厂需要将每个类的类型传递进去,这样我们才知道日志的归属类,才能更方便、更直观的定位到问题类

注意:Logger 对象是属于 org.slf4j 包下的,不要导入错包

因为 Spring Boot 中内置了日志框架 Slf4j,所以咱们可以直接在程序中调用 slf4j 来输出日志

常用日志框架说明

在这里插入图片描述

组合方案优势适用场景
SLF4J + Logback集成简单(Spring Boot 默认)、性能优大多数 Spring Boot 项目、中小型应用
SLF4J + Log4j 2高并发下性能极佳、功能最全大型企业级应用、高流量系统
SLF4J + JUL无第三方依赖、轻量极简 demo 项目、无需复杂日志功能
Commons Logging + Log4j兼容老项目(如 Spring 3.x 及以前)老旧项目维护(不推荐新项目使用)

使用日志对象打印日志

在这里插入图片描述
控制台效果如下:
在这里插入图片描述

日志格式说明

在这里插入图片描述

日志级别

日志级别有啥用

  • 日志的级别就是为了筛选符合目标的日志信息的。试想一下这样的场景,假设你是一家2万人公司的老板,那么每人员工的日常工作和琐碎的信息都要反馈给你吗?一定不会,因为你根本没有那么多精力。于是就有了组织架构,而组织架构就会分级,有很多的级别设置,如下图所示:
    在这里插入图片描述

  • 有了组织架构之后,就可以逐级别汇报消息了,例如:组员汇报给组长;组长汇报给研发一组;研发一组汇报给 Java 研发,等等依次进行汇报

  • 而日志分级大概的道理也是一样的,有了日志级别之后就可以过滤自己想看到的信息了,比如设置日志级别为 error,那么就可以只看程序的报错日志了,对于普通的调试日志和业务日志就可以忽略了,从而节省开发者的信息筛选时间

日志级别分类和使用

日志的级别分为:

  • trace:微量,少许的意思,级别最低
  • info:普通的打印信息
  • debug:需要调试时候的关键信息打印
  • warn:警告,不影响使用,但需要注意的问题
  • error:错误信息,级别较高的错误日志信息
  • fatal:致命的,因为代码异常导致程序退出执行的事件

在这里插入图片描述
注意⚠️:
越往上,收到的信息就越少

日志的使用

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {// 1. 注入Logger:参数为当前类的Class,便于定位日志归属private static final Logger logger = LoggerFactory.getLogger(UserController.class);@GetMapping("/login")public String login(String username, String password) {// 2. 打印不同级别的日志// trace:微量信息(如方法进入/退出,默认不输出)logger.trace("进入login方法,参数:username={}, password=***", username);// debug:调试信息(如关键变量值,开发环境常用)logger.debug("验证用户[{}]的密码长度:{}", username, password.length());// info:业务常规信息(如操作成功,生产环境可输出核心业务日志)logger.info("用户[{}]登录成功,IP地址:192.168.1.100", username);// warn:警告信息(如非致命异常、参数不规范,需关注但不影响流程)if (password.length() < 6) {logger.warn("用户[{}]使用弱密码登录,存在安全风险", username);}// error:错误信息(如业务异常、调用失败,需排查问题)try {// 模拟调用数据库失败int result = 1 / 0;} catch (Exception e) {// 打印异常时,需将Exception对象作为最后一个参数传入(便于输出堆栈信息)logger.error("用户[{}]登录时数据库操作失败", username, e);}return "login success";}
}

默认日志输出级别:

  • 清除掉配置文件中的日志设置,观察控制台输入的日志级别
  • 得到以下结论,日志的输出级别,默认为 info

日志持久化保存

在 Spring Boot 中,日志持久化是指将原本输出到控制台的日志,保存到文件系统中(如磁盘文件),以便后续追溯问题、分析系统运行状态等。以下是实现日志持久化的核心配置和说明:

核心配置方式(application.ymlapplication.properties
Spring Boot 支持通过简单的配置,指定日志文件的存储目录具体文件名,底层日志框架(如 Logback、Log4j2)会自动将日志写入对应位置。

  1. 配置日志存储目录
    指定日志文件的存储目录,Spring Boot 会在该目录下自动生成默认命名的日志文件(如 spring.log)。

yaml 配置(application.yml):

logging:file:path: D:/logs/spring-boot  # Windows 路径(注意用 / 或 \\)# 或 Linux/Mac 路径:/var/logs/spring-boot

properties 配置(application.properties):

logging.file.path=D:/logs/spring-boot
# 或 Linux/Mac:logging.file.path=/var/logs/spring-boot
  1. 配置具体日志文件名
    直接指定日志文件的完整路径和文件名,日志会精确写入该文件。

yaml 配置(application.yml):

logging:file:name: D:/logs/spring-boot/my-app.log  # Windows 路径# 或 Linux/Mac:/var/logs/spring-boot/my-app.log

properties 配置(application.properties):

logging.file.name=D:/logs/spring-boot/my-app.log
# 或 Linux/Mac:logging.file.name=/var/logs/spring-boot/my-app.log

更简单的日志输出——lombok

每次都使用 LoggerFactory.getLogger(xxx.class) 很繁琐,且每个类都添加一遍,也很麻烦,这里讲一种更好用的日志输出方式,使用 lombok 来更简单的输出。

  1. 添加 lombok 框架支持。
  2. 使用 @Slf4j 注解输出日志。
  • 添加 lombok 依赖
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version><optional>true</optional>
</dependency>
  • 输出日志
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/p")
@Slf4j
public class PersonController {@RequestMapping("/log")public void loggerTest() {log.error("---------------------- error ----------------------");}
}

注意:使用 @Slf4j 注解,在程序中使用 log 对象即可输入日志,并且只能使用 log 对象才能输出,这是 lombok 提供的对象名。

lombok更多注解说明

基本注解作用
@Getter自动添加 getter 方法
@Setter自动添加 setter 方法
@ToString自动添加 toString 方法
@EqualsAndHashCode自动添加 equals 和 hashCode 方法
@NoArgsConstructor自动添加无参构造方法
@AllArgsConstructor自动添加全属性构造方法,顺序按照属性的定义顺序
@NonNull属性不能为 null
@RequiredArgsConstructor自动添加必需属性的构造方法,final + @NonNull 的属性为必需
组合注解作用
@Data@Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor + @NoArgsConstructor
日志注解作用
@Slf4j添加一个名为 log 的日志,使用 slf4j

文章转载自:

http://IDFyWjxm.btbLm.cn
http://I0BsrsTL.btbLm.cn
http://TjB0Ak8X.btbLm.cn
http://b29rmUtZ.btbLm.cn
http://lvemoyAh.btbLm.cn
http://Eb6wHAG9.btbLm.cn
http://brBtCOgn.btbLm.cn
http://O2VfcJFk.btbLm.cn
http://Nu0Hn6pz.btbLm.cn
http://BB0IM5TS.btbLm.cn
http://5euDjcaR.btbLm.cn
http://TXAqEYIS.btbLm.cn
http://Y7uqXHzj.btbLm.cn
http://BgNEeO2h.btbLm.cn
http://HKvQpsKL.btbLm.cn
http://fTLV4T5J.btbLm.cn
http://J0jKYwgS.btbLm.cn
http://dWgoBDKx.btbLm.cn
http://zrUl1x2s.btbLm.cn
http://IZbIR7VG.btbLm.cn
http://UvOcDcDq.btbLm.cn
http://kfT8xhc1.btbLm.cn
http://80iCmhnp.btbLm.cn
http://whMFv5Ux.btbLm.cn
http://qJKNt7uC.btbLm.cn
http://MfUV2B6C.btbLm.cn
http://7Qy6Cxqy.btbLm.cn
http://m8mCmbfo.btbLm.cn
http://fMEmJyGZ.btbLm.cn
http://0XmbMFwf.btbLm.cn
http://www.dtcms.com/a/371771.html

相关文章:

  • 【HARP 第二期】HARP 的数据组织“约定”规范
  • 钾元素:从基础认知到多元应用与前沿探索
  • 如何短时间内精准定位指标异动根源
  • Geogebra 绘制 电磁波反射折射+斯涅尔定律+半波损失
  • Mia for Gmail for Mac 邮件管理软件
  • EXCEL VBA 清空Excel工作表(Sheet)的方法
  • kafka如何保证消息的顺序性
  • Python快速入门专业版(十):字符串特殊操作:去除空格、判断类型与编码转换
  • 【数据分析】微生物组数据的批次校正与分析
  • 技术前瞻:衡石Data Agent在多模态AI与复杂数据源下的扩展与挑战
  • 如何通过 Activepieces 实现智能工作流自动化
  • Knex 和 Schema 是什么?
  • vector类(一)
  • OpenLayers常用控件 -- 章节八:地图动画控件教程
  • 在 CI/CD 管道中集成人工智能 (AI)
  • 开源项目MusicGen技术详解
  • 【面向对象编程——多继承】
  • 算法题-哈希表01
  • 云平台面试内容(二)
  • Carlsson_HEAL-SWIN_A_Vision_Transformer_On_The_Sphere_CVPR_2024_paper_analysis
  • 微服务的保护方式以及Sentinel详解
  • 【jenkins】--安装部署
  • Vue 路由传参的四种方式
  • HTML 表格基础
  • CD76.【C++ Dev】AVL的模拟实现(1) 以左单旋为切口,分析旋转规律
  • 中国计算机发展史
  • LeetCode刷题记录----20.有效的括号(Easy)
  • 从voice和练习发声谈起
  • 5.python——数字
  • 数据化运营的工作流程