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://www.pswp.cn/bicheng/96144.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96144.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/96144.shtml

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

相关文章

五、误差反向传播法(上)

上一章中&#xff0c;我们介绍了神经网络的学习&#xff0c;并通过数值微分计算了神经网络的权重参数的梯度&#xff08;严格来说&#xff0c;是损失函数关于权重参数的梯度&#xff09;。数值微分虽然简单&#xff0c;也容易实现&#xff0c;但缺点是计算上比较费时间。本章我…

Rust Axum 快速上手指南(静态网页和动态网页2024版)

本文基于 Axum 0.7.5&#xff08;当前稳定版&#xff09;、tower-http 0.5.2、MiniJinja 0.7.2 编写&#xff0c;涵盖生产环境核心场景&#xff1a;tower-http Layer 叠加与数据传递、静态网页服务、MiniJinja 动态模板渲染&#xff0c;并重点解析请求 / 应答在多 Layer 中的流…

Golang语言设计理念

起源 Golang语言始于2007年&#xff0c;是一门编译型、静态类型、并发友好 的语言&#xff0c;由Robert Griesemer&#xff08; 罗伯特格里森、图灵奖获得者、C 语法联合发明人、Unix 之父&#xff09;、Rob Pike&#xff08; 罗布派克、Plan 9 操作系统领导者、UTF-8 编码的最…

深入掌握 nsenter:Linux命名空间操作的利器

#作者&#xff1a;朱雷 文章目录1、简介2、功能与用途2.1. 核心功能2.1.1. 进入命名空间2.1.2. 支持多种命名空间2.1.3. 容器调试3、安装3.1. 依赖包3.2. 权限要求3.3. 命令用法与示例3.3.1. 基本语法3.3.2. 常用选项包括&#xff1a;3.3.3. 示例4、 应用场景与优势4.1. 容器调…

Ubuntu Qt x64平台搭建 arm64 编译套件

环境&#xff1a; 主机平台&#xff1a;Ubuntu22.04.5 x86_64 目标平台&#xff1a;IMX8QM Ubuntu22.04.5 arm64 Qt版本&#xff1a;Qt6.5.3 LST GUI实现&#xff1a;QML 一、获取Ubuntu22.04.5 x86_64 系统镜像文件 1、镜像下载与安装 使用国内镜像下载对应版本的Ubuntu镜像…

mysql第五天学习 Mysql全局优化总结

Mysql全局优化总结 从上图可以看出SQL及索引的优化效果是最好的&#xff0c;而且成本最低&#xff0c;所以工作中我们要在这块花更多时间。 补充一点配置文件my.ini或my.cnf的全局参数&#xff1a; 假设服务器配置为&#xff1a; CPU&#xff1a;32核内存&#xff1a;64GDISK…

leetcode hot100 二叉搜索树

二叉搜索树的第k小的数class Solution:def kthSmallest(self, root: Optional[TreeNode], k: int) -> int:# 二叉搜索树的中序遍历是 升序排列的&#xff0c; 求第k小的&#xff0c;即第k个数self.res []def fun(root):if not root:returnfun(root.left)if root:self.res.a…

从Sonnet到Opus:一次解决RAG知识库流式输出难题的探索

又到周末&#xff0c;还得消耗消耗 ➡️ anyrouter 上的Claude资源&#xff0c;万一哪天都不能用了&#xff0c;也是浪费。 2025/9/5&#xff0c;Claude AI 的母公司 Anthropic 发布了一项新政策&#xff1a;即日起&#xff0c;Anthropic将不再对中国控股公司及其海外子公司开放…

「数据获取」中国科技统计年鉴(1991-2024)Excel

02、数据详情数据名称&#xff1a;《中国科技统计年鉴》&#xff08;1991-2024年&#xff09;数据年份&#xff1a;1991-202403、数据截图 04、获取方式&#xff08;获取方式看绑定的资源&#xff09;

SimLingo:纯视觉框架下的自动驾驶视觉 - 语言 - 动作融合模型

摘要 本文深入探讨了 SimLingo&#xff0c;一个在自动驾驶领域具有开创性意义的视觉-语言-动作一体化模型。SimLingo 创新性地将自动驾驶、语言理解和指令感知控制整合到一个统一的纯摄像头框架中&#xff0c;显著提升了自动驾驶系统在复杂环境中的感知、决策与执行能力。该模…

第五十四天(SQL注入数据类型参数格式JSONXML编码加密符号闭合复盘报告)

#SQL注入产生原理&#xff1a; 代码中执行的SQL语句存在可控变量导致 #常见SQL注入的利用过程&#xff1a; 1、判断数据库类型 2、判断参数类型及格式 3、判断数据格式及提交 4、判断数据回显及防护 5、获取数据库名&#xff0c;表名&#xff0c;列名 5、获取对应数据及…

VMWare上搭建Hive集群

文章目录1. MySQL安装2. 安装Hive集群3. 使用Hive客户端4. 实战总结本实战在VMware上搭建Hive集群&#xff0c;集成MySQL作为元数据存储&#xff0c;完成Hive环境配置、元数据初始化及HDFS仓库目录创建&#xff0c;实现Hive on Hadoop的SQL查询能力&#xff0c;为大数据分析提供…

Android网络之WIFI技术网络模型概述

文章目录术语1、WLAN与WIFI2、802.11 WIFI无线网络标准演进3、WIFI5、WIFI6和WIFI7的最高速率对比4、WIFI网络中的各个角色&#xff08;元件&#xff09;1&#xff09;网络拓扑架构图5、802.11权威指南1&#xff09;OSI与TCP/IP2&#xff09;IEEE 802.11协议簇介绍3&#xff09…

游戏中的设计模式——第三篇 简单工厂模式

5. 简单工厂模式 5.1 简单工厂模式的定义 简单工厂模式的核心是定义一个创建对象的接口&#xff0c;将对象的创建和本身的业务逻辑分离&#xff0c;降低系统的耦合度&#xff0c;使得两个修改起来相对容易些&#xff0c;当以后实现改变时&#xff0c;只需要修改工厂类即可。 5.…

基于SVN搭建企业内部知识库系统实践

一、准备工作 CentOS 7 服务器&#xff1a;确保你有 root 或 sudo 权限&#xff0c;可以访问该服务器。Windows 客户端&#xff1a;你将需要在 Windows 上安装 TortoiseSVN 客户端来与 SVN 服务器交互。防火墙&#xff1a;确保你的防火墙已开放 3690 端口&#xff0c;用于 SVN…

SQL注入7----(盲注与回显)

一.前言 在我们的注入语句被带入数据库查询但却什么都没有返回的情况我们该怎么办&#xff1f;例如应用程序就会返回 一个"通用的"的页面&#xff0c;或者重定向一个通用页面&#xff08;可能为网站首页&#xff09;。这时&#xff0c;我们之前学习的SQL注入办 法就…

尚硅谷宋红康JVM全套教程(详解java虚拟机)

https://www.bilibili.com/opus/1071553679925968898 案例7&#xff1a;日均百万订单系统JVM参数设置 https://github.com/wei198621/jvm_by_atguigu https://github.com/xftxyz2001/atguigu-jvm/blob/main/JavaYouthdocsJVM/%E7%AC%AC1%E7%AB%A0-JVM%E4%B8%8EJava%E4%BD%…

鸿蒙NEXT开发实战:图片显示、几何图形与自定义绘制详解

探索HarmonyOS NEXT强大的图形渲染能力&#xff0c;从图片展示到自定义绘图 HarmonyOS NEXT作为华为自主研发的操作系统&#xff0c;为开发者提供了一套丰富而强大的图形渲染能力。无论是显示图片、绘制几何图形&#xff0c;还是实现复杂的自定义绘图&#xff0c;鸿蒙都提供了简…

python + Flask模块学习 2 接收用户请求并返回json数据

用到的模块还是flask&#xff0c;用到的类有Flask&#xff0c; request&#xff0c; jsonfiy &#x1f642; 目录 1、GET请求 2、POST请求 1、表单格式 2、json格式 就酱&#xff0c;也比较简单&#xff0c;下一篇说简单的授权&#xff0c;简单来说就是比如用户付费买了服…

国内外常用的免费BUG管理工具选型

帮助用户根据自身情况做决定&#xff0c;比如团队规模、技术能力、是否需要移动端支持等。避免只是罗列工具&#xff0c;而是提供实际选择的维度。 国内外常用的免费BUG管理工具选择非常丰富&#xff0c;从轻量级到功能全面型都有覆盖。我将它们分为几类&#xff0c;并详细介绍…