Spring Boot的日志文件

目录

日志的作用

日志的打印

常见的日志框架

自定义的日志打印

为什么不用sout来打印日志

Spring Boot日志打印

1.得到日志对象

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

日志级别

日志级别的顺序

日志级别的设置

日志持久化

配置日志文件的保存路径

配置日志文件的文件名

日志文件最大说明

更简单的日志输出-lombok

lombok原理

快速添加Spring Boot依赖


日志的作用

  1. 通过查看日志,来排除和定位问题,这也是日志最主要的通途.
  2. 记录用户的登录日志,方便分析用户是正常登录还是恶意破解用户.
  3. 记录系统的操作日志,方便数据恢复和定位操作人.
  4. 记录程序的执行时间,方便以后优化程序提供数据的支持.

日志的打印

当我们在启动Spring Boot项目的时候,控制台里已经有日志的打印了.

这些都是系统打印的日志.

这就说明Spring Boot是已经内置了日志框架的,如果不内置是无法进行日志的打印的.

那么开发者应该如何自定义打印日志呢?控制台打印的日志并非是持久化的,那么怎么持久化的保存日志呢?


常见的日志框架

Spring Boot内置的日志框架是SLF4J和logback.

日志门面是设计模式的一种,门面模式.日志门面的身份就类似于中间代理.当我们要打印日志的时候,我们的请求是首先到达日志门面,由日志门面里的框架,根据我们的配置和驱动来决定最后使用哪一个日志实现的框架. 

这样做的好处就是当当前的日志实现的框架挂掉了之后,我们可以自然衔接到另一个日志实现框架,无需对代码进行大量的修改.


自定义的日志打印

为什么不用sout来打印日志

不用sout来打印日志的原因:

  • 相比于系统打印的日志来说,sout打印的日志少了很多信息,比如日志的打印时间和打印日志的位置
  • sout没有日志级别的控制
  • sout打印的日志不能持久化保存,并且生产环境是后台启动项目,无法看到控制台打印的信息. 

Spring Boot日志打印

1.得到日志对象

日志对象是私有的,每个类对应到一个日志对象.

日志对象是定义在类里的,而不是方法里,所以日志对象的作用范围是整个类.

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

log点出来的方法有很多,都是对应到不同日志级别的打印方法.

访问sayHi,查看控制台信息.

可以看到只打印了三条,trace和dubug没有打印.

这是因为默认的日志级别是info,只有info及以上级别的日志才能被打印.


日志级别

日志级别的顺序

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

级别设置的越高,收到的信息越少.如果级别设置了warn,那么就只能收到warn,error和fatal级别的日志了.


日志级别的设置

通过在配置文件中设置logging.level配置项.

此时启动项目,查看控制台:

没有日志的打印,这是因为我们的日志级别设置成了error,没有日志的打印说明没有错误日志.

访问sayHi,查看控制台:

可以看到日志的打印,同时也打印了trace和dubug,这是因为我们设置com.example.demo.controller下的日志级别是trace. 


日志持久化

我们上面日志的输出都是在控制台上,但是在生产环境下我们需要把日志都保存下来,以便出现问题之后通过日志来定位问题,把日志保存下来的过程就叫做持久化.

日志持久化很简单,只需要在配置文件中指定日志的存储目录或者指定日志保存的文件名,Spring Boot就会把控制台的日志写到响应的目录或者文件下了.

配置日志文件的保存路径

访问sayHi

 可以看到控制台打印了日志

同时,在D:\\log下生成了一个spring.log文件,打开查看,发现也有了日志内容.

 再次访问sayHi,日志内容会追加,而不会覆盖.


配置日志文件的文件名

再次启动项目,访问sayHi. 

 可以看到,在我们只设置名字而不设置路径的时候,日志会默认保存在当前项目的路径下.

我们也可以在name里设置路径+名字,这样就日志可以保存在我们设置的路径下了.

访问sayHi

可以看到在我们设置的路径下生成了springboot.log


日志文件最大说明

所以关于日志的持久化我们得出一个结论:日志文件一旦产生,那么日志文件及其内容就会永久的保存,不会出现文件或内容的丢失,无论任何操作都会保持以上这一特性.

那这样会不会出现一个问题:当我们保存日志的文件一直积累日志内容,文件大到我们无法打开 ?

答案是不会的,Spring Boot帮我们做了规定.

这是spring官网关于系统配置项的说明.

官网系统项说明的网址:Common Application Properties 

也就是说一旦日志文件超过了10MB,Spring Boot会在相同的目录下自动帮我们生成一个日志文件,来保存接下里的内容(新文件的名字会有-1,-2的标识),这就起到了日志分割的作用.我们也可以主动去设置文件最大的值.


更简单的日志输出-lombok

这是lombok插件提供给我们的注解,使用这个注解前提是安装了lombok插件并且引入了lombok的依赖.

这样就可以在代码里省去logger对象的创建.


lombok原理

lombok框架的是在编译的时候起作用的,在编译的时候,lombok会根据我们给出的lombok注解来实现相应的作用.

使用lombok和不是用过lombok最终生成的字节码是一样的,所以lombok不会改变运行的效率.

使用lombok只是帮我们省去了手写部分代码的麻烦,它会在编译期间,帮我们将对应的代码写到类当中去.

我们可以在idea中查看,来验证我们所说的.

target目录下就是程序运行时所生成的字节码文件,我们可以直接在idea中查看,idea会自动的将字节码转为Java程序.

我们可以看到,生成的字节码文件里是有创建log对象这一过程的.


快速添加Spring Boot依赖

如果我们在Spring Boot项目创建的时候没有引入依赖,等项目创建好之后,我们依然可以在pom.xml文件中引入对应的依赖,可以通过原始的方式,去maven仓库拷贝,但是这一过程太过麻烦,而且还要考虑版本适配的问题.

因此我们可以使用EditStarters插件来实现快速添加依赖的功能.

步骤:

1.安装完插件之后,重启idea.

2.在pom.xml文件中右键,点击生成,点击EditStarters,就可以进入页面来添加依赖.

 

  

这样依赖就自动添加到pom.xml中了,最后点击reload即可.


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用扩展方法来实现EventTrigger中事件的异步等待

一、什么是扩展方法? 扩展方法是一种C#语言提供的功能,允许我们向现有类型添加新的方法,而无需修改类型的源代码。扩展方法的优缺点如下: 二、它有什么优点? 1、不需要修改源类型的代码:使用扩展方法可以…

Vue 手搓轮播效果

tiptop: 为啥需要写这个功能,因为我遇到了每个轮播层内要放3个左右的商品块,如果使用element自带的轮播就需要将一维数组切成二维数组,导致处理一些情况下就会变得很麻烦,当然那种我也写了如果你们有需要,在下方留言我…

使用chatGPT开发获取格点天气数据

1. 格点天气 1.1. 格点天气 以经纬度为基准的全球高精度、公里级、格点化天气预报产品,包括任意经纬度的实时天气和天气预报。其中,任意坐标的高精度天气,精确到3-5公里范围,包括:温度、湿度、大气压、天气状况、风力…

信息化发展

信息系统是:管理模型、信息处理模型和系统实现条件结合的 信息系统生命周期: 可行性分析与项目开发计划 需求分析 概要设计 详细设计 编码 测试 可以简化为: 系统规划:现行情况的分析,可行性研究报告 -> 设计任务…

Docker安装运行Nginx容器(纯步骤)

Docker安装Nginx容器并运行 本文章只有步骤,没有原理解释,只做平时学习提示。提前说明:由于nginx里的配置文件比较多,所以本文章不对此配置文件解释而且会有一些小问题,这个你酌情操作,但不影响你nginx容器…

数据库课设--基于Python+MySQL的餐厅点餐系统

文章目录 一、系统需求分析二、系统设计1. 功能结构设计2、概念设计2.2.1 bill_food表E-R图2.2.2 bills表E-R图2.2.3 categories E-R图2.2.4 discounts表 E-R图2.2.5 emp表E-R图2.2.6 food 表E-R图2.2.7 member表E-R图2.2.8 member_point_bill表E-R图2.2.9 servers表E-R图2.2.1…

最常用的从A到Z的Linux命令,真的很好记,三分钟刷完!

Linux的命令行是一个非常强大的工具。如果你知道如何利用Linux命令,你可以轻松地在Linux系统中执行各种任务。在这篇文章中,我们将介绍从A到Z的Linux命令。 alias alias命令允许你为常用的命令设置一个短的别名,以节省时间和减少敲击。例如&…

力扣,合并石头最低成本算法题

1:这个题有题解,自己可以去看力扣,合并石头 2:网上也有视频自己去看视频讲解 3:下面我自己的一些理解 4:原需求: 5:代码:使用贪心算法和最小堆来求解: im…

第九章 子查询

文章目录 前言一、.需求分析与问题解决1 、实际问题2 、子查询的基本使用3 、子查询的分类 二、单行子查询1、单行比较操作符2、代码示例3、 HAVING 中的子查询4、CASE中的子查询5、 子查询中的空值问题6、非法使用子查询 三、多行子查询1、 多行比较操作符2、代码示例3 、空值…

这可能是你看过最详细的Java集合篇【二】—— LinkedList

文章目录 LinkedList继承关系数据结构变量构造方法添加元素相关方法查找元素相关方法删除元素相关方法清空方法遍历方法其它方法常见面试题 LinkedList LinkedList底层数据结构是双向链表。链表数据结构的特点是每个元素分配的空间不必连续、插入和删除元素时速度非常快、但访…

python@可变对象和不可变对象@按值传递和引用传递@python运行可视化工具

文章目录 可变对象和不可变对象🎈可视化工具🎈可变对象和idegeg变量名和内存地址🎈函数调用对参数的修改😂Note 按值传递vs引用传递note🎈如何借助函数修改外部变量的值?Note 可变对象和不可变对象🎈 在Py…

数据库的概念?怎么在linux内安装数据库?怎么使用?

目录 一、概念 二、mysql安装及设置 1.安装mysql 2.数据库服务启动停止 三、数据库基本操作 1、数据库的登录及退出 2、数据表的操作 3、mysql查询操作 一、概念 数据库:是存放数据的仓库,它是一个按数据结构来存储和管理数据的计算机软件系统。数据库管理…

SQLServer的内存管理架构

内存管理架构说明 一、Windows的虚拟内存管理器二、SQL Server 内存体系结构2.1、传统(虚拟)内存2.2、地址窗口扩展 (AWE) 内存 三、从 SQL Server 2012 (11.x) 开始发生的改变3.1、对内存管理的更改3.2、对…

安装多个NodeJS windows上安装多个Nodejs版本 解决vue2/vue3同时运行

第一步下载nvm-windowsnvm-windows 下载地址:Github最新下载地址 进入之后直接下载 第二步 安装NVM 注意路径一定不要包含空格 中文否则会报错 点击安装之后 如果之前安装了nodejs的话会提示 希望nvm管理已安装node 版本吗 点击 是 即可 安装完成后 打开 cmd 输入 n…

Bito:一款 iead/webstorm 神级插件,由 ChatGPT 团队开发,堪称辅助神器

前言: idea(后端),webstorm(前端)中可以用的一款辅助插件:Bito 个人尝试体验效果: 优点是:可以自动完成一些场景代码。 缺点:太慢了,大部分时间一直转圈 摘取文档: 什么是Bito&…

TDA4VM/VH 芯片硬件 mailbox

请从官网下载 TD4VM 技术参考手册,地址如下: TDA4VM 技术参考手册地址 概述 (Mailbox 的介绍在 TRM 的第7.1章节) Mailbox 使用邮箱中断机制实现了 VM 芯片的核间通信。 Mailbox 是集成在 NAVSS0 域下的一个外设(NAVSS0 的说明可以查看&a…

flink on k8s提交任务

目录 相关文档前置准备构建镜像提交任务 相关文档 https://nightlies.apache.org/flink/flink-docs-release-1.13/docs/deployment/resource-providers/native_kubernetes/ 前置准备 flink的lib目录下放入两个依赖 bcpkix-jdk15on-1.68.jar bcprov-jdk15on-1.69.jar 创建用户…

CRM客户关系管理系统主要有哪些功能?

一、CRM客户管理系统是什么 客户关系管理(Customer Relationship Management,简称CRM),是指企业为提高核心竞争力,利用相应的信息技术以及互联网技术协调企业与顾客间在销售、营销和服务上的交互,从而提升…

关于HTML5画布canvas的功能

一、画布的使用 1、首先创建一个画布&#xff08;canvas&#xff09; <canvas id”myCanvas” width”200” height”100” style”border:1px solid #000000”></canvas> 2、使用JavaScript来绘制图像 <script> Var cdocument.getElementByID(“myCanv…

AlgoC++第八课:手写BP

目录 手写BP前言1. 数据加载2. 前向传播3. 反向传播总结 手写BP 前言 手写AI推出的全新面向AI算法的C课程 Algo C&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考。 本次课程主要是手写 BP 代码 课程大纲可看下面的思维导图 1. 数据加载 我们首先来实现下MNIST…