SpringBoot 日志文件

一、日志的作用

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

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

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

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

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

日志真实使用案例:

关键节点上的关键数据日志记录举例:例如教务系统,在注册时候不止要在教务系统添加一条用户记录,同时也会给论坛添加一条一模一样的用户记录,这样做的目的是为了实现一次注册,多处使用的目的。不需要用户在两边系统注册了,等于在程序中以极低的成本实现的用户数据的同步,但这样设计有一个致命的问题,用户在教务系统注册信息的时候,如果论坛挂了,那么用户的注册行为就会失败?因为用户在注册的时候需要同步注册到论坛系统,但论坛现在挂了,这个时候怎么办呢?

最简单的解决方案,教务系统在注册的时候,不管论坛是否注册成功,都给用户返回成功,那这个时候如果论坛注册失败了怎么办?非常简单,如果注册失败了,记录一下日志,等论坛恢复正常之后,把日志给论坛的管理人员,让他⼿动将注册失败的用户同步到论坛系统,这样就最低成本的解决了问题。这就是日志的重要作用


二、日志怎么用

Spring Boot 项目在启动的时候默认就有日志输出

在这里插入图片描述

以上内容就是 Spring Boot 输出的控制台日志信息。

通过上述日志信息我们能发现以下 3 个问题:

  • Spring Boot 内置了日志框架(不然也输出不了日志)。
  • 默认情况下,输出的日志并非是开发者定义和打印的,那开发者怎么在程序中自定义打印日志呢?
  • 日志默认是打印在控制台上的,而控制台的日志是不能被保存的,那么怎么把日志永久的保存下来呢

三、自定义日志打印

1、使用日志对象打印日志

Spring Boot自定义日志的打印:

1). 在一个类中先获取到打印日志对象(日志框架提供的日志对象,而日志框架默认已经集成到Spring Boot 里了);

  • 得到日志对象Logger ->Logger 对象是属于 org.slf4j 包下的,不要导入错包
  • 因为 Spring Boot 中内置了日志框架 Slf4j,所以咱们可以直接在程序中调用 slf4j 来输出日志

在这里插入图片描述

2). 使用日志对象提供的方法实现日志的打印

  • 在程序中获取日志对象需要使用日志工厂 LoggerFactory
  • 日志工厂需要将每个类的类型传递进去,这样我们才知道日志的归属类,才能更方便、更直观的定位到问题类
@Controller
@ResponseBody // 非静态数据
public class UserController {// 1、先得到日志对象——来自于slf4jprivate final static Logger log =LoggerFactory.getLogger(UserController.class); // 设置当前类的类型@RequestMapping("/sayhi")public void sayHi() {log.trace("I'm trace");log.debug("I'm debug");log.info("I'm info");log.warn("I'm warn");log.error("I'm error");}
}

访问 http://localhost:8080/sayhi,打印日志效果展示:

在这里插入图片描述

默认日志输出级别:

  • 当前未配置文件中的日志设置,观察控制台输入的日志级别,得到以下结论,日志的输出级别,默认是 info

常⻅的日志框架说明(了解)

在这里插入图片描述


2、日志格式说明

在这里插入图片描述


四、日志级别与分类

1、什么是日志级别

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

在这里插入图片描述

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

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


2、日志级别分类

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

日志级别的顺序:

在这里插入图片描述

越往上接收到的消息就越少


3、日志使用

日志级别配置只需要在配置文件中设置 “logging.level” 配置项即可,配置根路径的日志级别,application.properties:

# 设置全局的日志级别
logging.level.root=trace

在这里插入图片描述

# 设置局部的日志级别
logging.level.com.example.springboot_logger=warn

注意: 当存在局部日志级别 和 全局的日志级别设置时,当访问局部日志时,使用的是局部日志级别,也就是局部日志级别优先级 > 全局的日志级别


五、日志持久化

# 设置全局的日志级别
logging.level.root=info# 设置局部的日志级别
logging.level.com.example.springboot_logger.controller=trace

以上的日志都是输出在控制台上的,然而在生产环境上咱们需要将日志保存下来,以便出现问题之后追溯问题,把日志保存下来的过程就叫做持久化

**1). 在配置文件中指定日志的存储目录,**当设置了保存路径之后,Spring Boot 就会将控制台的日志写到相应的目录或文件下了

**2). 在配置文件中设置日志保存的名称,**日志会自动进行持久化

1、配置日志文件的保存路径

错误方式:logging.file.path=F:\Download ——SpringBoot会认为是一个特殊的字符,而非目录,所以日志持久化不会成功

——正确设置日志路径的方式 1:

# 配置日志文件的保存路径
logging.file.path=F:/Download

生成一个 spring.log 文件,vscode 打开:

在这里插入图片描述

——正确设置日志路径的方式 2:

# 配置日志文件的保存路径
# logging.file.path=F:/Download
logging.file.path=F:\\Download

删除此文件,重新运行,同样会生成 spring.log 文件


2、配置日志文件的文件名

# 设置日志文件的保存名称
# 1)
# logging.file.name=spring_boot.log
# 2) 指定目录
logging.file.name=F:\\Download\\spring_boot.log

生成一个 spring_boot.log 文件

日志数据默认是追加而不是覆盖,当日志数据变多,也不需要设置日志大小,当用满时,会自动以数字 123… 分割文件

在这里插入图片描述

综合练习:将 controller 包下 error 级别以上的日志保存到 log_all.log 下,将 service 下 warn
级别以上的日志保存到 log_all.log 下

实现的关键步骤:

  • 不同包定义不同的日志级别。
  • 使用日志对象打印所有类型的日志。
  • 设置固定的日志保存文件名

六、更简单的日志输出—lombok

1、lombok

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

1). 添加 lombok 框架支持

——添加插件 EditStarters,

在这里插入图片描述

——使用 EditStarters 添加 lombok

在这里插入图片描述

2). 使用 @slf4j 注解输出日志

@Controller // 直接和前端交互,不能用 @Service
@ResponseBody
@Slf4j // 替代了 LoggerFactory.getLogger 操作
public class UserService {@RequestMapping("/sayhi2")public void sayHi() {log.trace("I'm trace");log.debug("I'm debug");log.info("I'm info");log.warn("I'm warn");log.error("I'm error");}
}

——设置日志级别配置 application.properties:

# 设置局部的日志级别
logging.level.com.example.springboot_logger.controller=trace

——访问 http://localhost:8080/sayhi2:

在这里插入图片描述

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


2、lombok 原理解释

lombok 能够打印日志的密码就在 target 目录里⾯,target 为项目最终执行的代码,查看 target 目录如下:

在这里插入图片描述

Java 程序的运行原理:

在这里插入图片描述

Lombok 的作用如下图所示:

在这里插入图片描述


3、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

总结:

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

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

日志级别依次提升,而日志界别越高,收到的日志信息也就越少,我们可以通过配置日志的保存名称或保存目录来将日志永久地保存下来


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

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

相关文章

C语言数组笔试题(详解)

目录 插入知识: 一.指向函数指针数组的指针 二.回调函数 什么是回调函数? 三.数组笔试题 个人名片: 🐼作者简介:一名乐于分享在学习道路上收获的大二在校生🐻‍❄个人主页:GOTXX &#x1f4…

【Apollo学习笔记】—— 相机仿真

文章目录 前言相关代码整理 测试实践文件目录包管理BUILD文件以及cyberfile.xml文件源程序BUILD运行结果其他参考CameraOutput channels启动camera驱动启动camera video compression驱动 前言 本文是对Cyber RT的学习记录,文章可能存在不严谨、不完善、有缺漏的部分&#xff0…

[迁移学习]领域泛化

一、概念 相较于领域适应,领域泛化(Domain generalization)最显著的区别在于训练过程中不能访问测试集。 领域泛化的损失函数一般可以描述为以下形式: 该式分为三项:第一项表示各训练集权重的线性组合,其中π为使该项最小的系数&a…

react工程化配置

道阻且长,行而不辍,未来可期 1.安装react yarn create react-app demo --template typescript cd demo yarn start2.配置蓝图模版 2.1安装blueprint插件 https://github.com/shredor/blueprint-templates-cli#readme yarn add blueprint-templates-c…

WAF绕过-漏洞利用篇-sql注入+文件上传-过狗

WAF绕过主要集中在信息收集,漏洞发现,漏洞利用,权限控制四个阶段。 1、什么是WAF? Web Application Firewall(web应用防火墙),一种公认的说法是“web应用防火墙通过执行一系列针对HTTP/HTTPS的安…

webpack基础知识六:说说webpack的热更新是如何做到的?原理是什么?

一、是什么 HMR全称 Hot Module Replacement,可以理解为模块热替换,指在应用程序运行过程中,替换、添加、删除模块,而无需重新刷新整个应用 例如,我们在应用运行过程中修改了某个模块,通过自动刷新会导致…

【C#学习笔记】装箱和拆箱

文章目录 装箱和拆箱性能消耗装箱拆箱 比较var&#xff0c;object&#xff0c;dynamic&#xff0c;\<T\>varobject\<T\> 泛型dynamic 装箱和拆箱 在讲引用类型object的时候&#xff0c;我们说它是万能的&#xff0c;却没说它万能在哪里。 除了object为每一种变量…

Grafana集成prometheus(4.Grafana添加预警)

上文已经完成了grafana对prometheus的集成及数据导入&#xff0c;本文主要记录grafana的预警功能&#xff08;以内存为例&#xff09; 添加预警 添加入口&#xff08;2个&#xff09; databorard面板点击edit&#xff0c;下方有个Alert的tab&#xff0c;创建Alert rules依赖…

ffmpeg + nginx 实现rtsp视频流转m3u8视频流,转码推流(linux)

FFmpeg即是一款音视频编解码工具&#xff0c;同时也是一组音视频编码开发套件&#xff0c;作为编码开发套件&#xff0c;它为开发者提供了丰富的音视频处理的调用接口。 FFmpeg提供了多种媒体格式的封装和解封装&#xff0c;包括多种音视频编码、多种协议的流媒体、多种多彩格式…

苹果电脑第三方应用程序卸载工具CleanMyMacX4.14

CleanMyMacX&#xff0c;这是一款可以帮助你快速识别并卸载电脑上的多个应用程序的第三方工具&#xff0c;省去了逐个卸载的繁琐步骤。 我们首先要到下载CleanMyMacX&#xff0c; CleanMyMac X全新版下载如下: https://wm.makeding.com/iclk/?zoneid49983 然后&#xff0c…

【项目 计网2】4.4网络模型 4.5协议 4.6网络通信的过程

文章目录 4.4网络模型OSI七层参考模型TCP/IP四层模型&#xff08;常用&#xff09;简介四层介绍 4.5协议简介常见协议UDP协议TCP协议IP协议以太网帧协议&#xff08;MAC地址封装&#xff09;ARP协议&#xff08;IP->MAC&#xff09; 4.6网络通信的过程封装分用 4.4网络模型 …

Stable Diffusion 硬核生存指南:WebUI 中的 GFPGAN

本篇文章聊聊 Stable Diffusion WebUI 中的核心组件&#xff0c;强壮的人脸图像面部画面修复模型 GFPGAN 相关的事情。 写在前面 本篇文章的主角是开源项目 TencentARC/GFPGAN&#xff0c;和上一篇文章《Stable Diffusion 硬核生存指南&#xff1a;WebUI 中的 CodeFormer》提…

k8s存储卷

目录 一、为什么要存储卷&#xff1f;二、emptyDir存储卷三、hostPath存储卷四、 nfs共享存储卷五、PVC 和 PV5.1 PV和PVC之间的相互作用遵循的生命周期5.2 PV 的状态5.3 一个PV从创建到销毁的具体流程 六、静态创建pv和pvc资源由pod运用过程6.1 在NFS主机上创建共享目录&#…

03 制作Ubuntu启动盘

1 软碟通 我是用软碟通制作启动盘。安装软碟通时一定要把虚拟光驱给勾选上&#xff0c;其余两个可以看你心情。 2 镜像文件 我使用清华镜像网站找到的Ubuntu镜像文件。 Index of /ubuntu-releases/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 请自己选择镜像…

K8S系列文章之 使用Kind部署K8S 并发布服务

简单介绍 kind 即 Kubernetes In Docker&#xff0c;顾名思义&#xff0c;就是将 k8s 所需要的所有组件&#xff0c;全部部署在一个docker容器中&#xff0c;是一套开箱即用的 k8s 环境搭建方案。使用 kind 搭建的集群无法在生产中使用&#xff0c;但是如果你只是想在本地简单…

队列中offer,add;poll,remove;peek,element之间的区别

offer和add的区别 offer() 和 add() 都是向队列中加入新项。 一些队列有大小限制&#xff0c;因此如果想在一个满的队列中加入一个新项&#xff0c;多出的项就会被拒绝。 这时新的offer方法就可以起作用了。它不是对调用add()方法抛出一个unchecked异常&#xff0c;而只是得…

初阶C语言——特别详细地介绍函数

系列文章目录 第一章 “C“浒传——初识C语言&#xff08;更适合初学者体质哦&#xff01;&#xff09; 第二章 详细认识分支语句和循环语句以及他们的易错点 第三章 初阶C语言——特别详细地介绍函数 目录 系列文章目录 前言 一、函数是个什么鬼东西&#xff1f; 二、C语…

css中的bfc是什么?

什么bfc&#xff1f; BFC&#xff08;Block Formatting Context&#xff09;块级 格式化 上下文。 BFC就是页面上的一个隔离的独立盒子&#xff0c;容器里面的子元素和外面的元素不会相互影响。 为什么要bfc? bfc是我们去主动触发的,并不是自动就存在的,它是帮助我们解决cs…

【雕爷学编程】MicroPython动手做(28)——物联网之Yeelight 2

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

数据库与数据仓库的区别及关系

数据库与数据仓库的区别及关系 数据库数据仓库异同差异联系例子 数据库 数据库是结构化信息或数据的有序集合&#xff0c;一般以电子形式存储在计算机系统中。通常由数据库管理系统 (DBMS) 来控制。它是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集…