【Spring Boot学习】日志文件,Spring Boot也会写日记了,这些事你知道嘛 ? ? ?

news2024/12/23 6:09:52

前言:
大家好,我是良辰丫,在上一篇文章中我们已经学习了Spring Boot的配置,接下来我们要学习一些日志相关的东西,什么是日志呢?我们慢慢往下看.💌💌💌

🧑个人主页:良辰针不戳
📖所属专栏:javaEE进阶篇之框架学习
🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些伤口会成为我们一辈子的财富。
💦期待大家三连,关注,点赞,收藏。
💌作者能力有限,可能也会出错,欢迎大家指正。
💞愿与君为伴,共探Java汪洋大海。

在这里插入图片描述

目录

  • 1. 初识日志
  • 2. Spring Boot的日志
  • 3. 自定义日志
    • 3.1 得到日志对象
    • 3.2 打印日志内容
    • 3.3 日志格式
    • 3.4 简述日志框架
  • 4. 日志级别
    • 4.1 日志级别的作用
    • 4.2 日志级别分类
    • 4.3 日志级别使用规则
  • 5. 日志持久化
    • 5.1 配置日志文件路径
    • 5.2 配置日志文件名称
  • 6. Lombok 日志输出

1. 初识日志

什么是日志呢?

  • 日志 相当于我们自己写的日记,记录自己的真实生活所发生的事情.
  • 在计算机中,日志 是我们程序(或者系统)写的日记,记录系统运行过程中各种重要信息的文件,在系统运行过程中由各进程创建并记录。
  • 简单来说,日志就是记录时间以及各种进程或者线程发生的数据的文件,比如错误信息,修改信息等.

日志有什么作用呢?

  • 记录⽤户登录⽇志,⽅便分析⽤户是正常登录还是恶意破解⽤户。也就是服务器通过日志可以有效地减少用户恶意破解登录,有效的保障了用户的安全.
  • 记录系统的操作⽇志,⽅便数据恢复和定位操作⼈。程序有问题,我们可以通过日志快速的定位,并且进行相应的操作去修改错误.
  • 记录程序的执⾏时间,⽅便为以后优化程序提供数据支持。通过时间我们可以知道哪个时间段程序(系统)做了什么.
  • 简而言之,记录系统的运行过程及异常信息,为快速定位系统运行中出现的问题及开发过程中的程序调试问题提供详细信息(也就是快速找到错误原因)。

2. Spring Boot的日志

在我们的Spring Boot的控制台上其实就有日志信息.

在这里插入图片描述

  • Spring Boot 内置了⽇志框架, 控制台上自行的打印自己的日志信息.
  • 了解了Spring Boot 控制台的日志后,接下来我们来一起去学习程序员如何定义日志并且去使用日志.

3. 自定义日志

  • 得到日志对象.
  • 打印日志内容.

完整代码:

package com.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ResponseBody;

@RequestMapping("/user5")
@Controller
@ResponseBody // 用来设置当前类中所有的方法返回的是数据而非页面

public class User5 {
    // 1.得到日志对象
    private static final Logger logger = LoggerFactory.getLogger(User5.class);

    @RequestMapping("/log")
    public String sayHi() {
        // 写日志
        logger.trace("我是 trace");
        logger.debug("我是 debug");
        logger.info("我是 info");
        logger.warn("我是 warn");
        logger.error("我是 error");
        System.out.println("日志打印完成.");
        return "Hi,叶良辰.";
    }
}

3.1 得到日志对象

  • 注意代码中好多东西都是规定哈,没有什么为什么,比如使用LoggerFactory,大家多写几次,熟悉就行了.
  • 为了定位我们的日志属于哪个类,我们需要把类名传进去.
  • 很多人会因为导错包而会出现没有找到该关键字的错误,我们要导入的包是org.slf4j.
// 1.得到日志对象
    private static final Logger logger = LoggerFactory.getLogger(User5.class);

3.2 打印日志内容

日志内容有很多种,我们先来采取几种看一下效果.


    @RequestMapping("/log")
    public String sayHi() {
        // 写日志
        logger.trace("我是 trace");
        logger.debug("我是 debug");
        logger.info("我是 info");
        logger.warn("我是 warn");
        logger.error("我是 error");
        System.out.println("日志打印完成.");
        return "Hi,叶良辰.";
    }
  • 我们需要重启服务器,也就是Spring Boot.
  • 通过浏览器访问我们的页面,一定要进行访问,要不然控制台不会出现我们的日志信息,为什么我的端口号是8888呢,在上一篇配置文件的文章中,我们为了说明端口配置,把端口号改成了8888.
    在这里插入图片描述

运行结果如下:

在这里插入图片描述

  • 在这个时候,我们发现问题了,我们有5个日志,为什么打印出3个呢?
  • 我们在代码中有一条"日志打印完成"的输出语句,就是为了表示日志打印完成了,在我们的控制台上已经打印出来了该语句,那么说明打印已经完成,为什么日志没有全部打印呢?
  • 原来呀,我们的日志是有一定的级别的,具体怎么回事呢?别着急,我们在了解日志级别之前,先来了解一些日志相关的东西.

3.3 日志格式

在这里插入图片描述

  • 日志打印时间 : 记录日志的时间.
  • 日志打印级别,在下面我们会进行介绍.
  • 线程ID,日志往往是通过线程负责的,在这里,咱们的线程是Spring Boot分配的,每次运行分配的线程一般是不同的.
  • 线程名称,这里指的是系统对线程的命名.
  • 执行的类名,表示该日志是打印哪个类的日志信息.
  • 日志信息,程序员定义的,用来表示日志数据.

3.4 简述日志框架

在这里插入图片描述

  • Spring Boot在设计日志框架的时候采取了门面模式,这是一种设计模式.但是23种设计模式中没有门面模式,因为门面模式是最后出来的.
  • 门面模式的主要作用是解耦,Spring Boot内置了日志框架,程序员在使用的时候只需要调用slf4j就可以了,slf4j这相当于一个中介,它负责处理细节,我们使用的时候只需要去调用它即可,不需要关注它的细节.

4. 日志级别

4.1 日志级别的作用

学习日志级别,首先我们需要去了解日志级别的作用.

  • ⽇志级别可以帮你筛选出重要的信息,⽐如设置⽇志级别为 error,那么就可以只看程序的报错⽇志了,对于普通的调试⽇志和业务⽇志就可以忽略了,从⽽节省开发者信息筛选的时间。
  • ⽇志级别可以控制不同环境下,⼀个程序是否需要打印⽇志,如开发环境我们需要很详细的信息,⽽⽣产环境为了保证性能和安全性就会输⼊尽量少的⽇志,⽽通过⽇志的级别就可以实现此需求。

4.2 日志级别分类

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

在这里插入图片描述

4.3 日志级别使用规则

  • 当程序中设置了日志级别后,那么程序只会打印和级别相同或者大于当前几倍的日志,小于当前级别的日志不会输出
  • Spring Boot的默认级别是info.咱们在上面打印出三条日志信息,大于等于info的日志才会被打印出来,大于等于info级别的有三个,因此打印三条.

在yml中设置日志级别,我们设置一个trace级别,重启服务器,重新访问页面.

# 配置日志级别
logging:
  level:
    root: trace

运行结果:

在这里插入图片描述
此时,我们的五条日志信息全部打印出来了.

5. 日志持久化

  • 在上述我们的日志只是短暂的存储,重启服务器就会消失,我们需要把日志持久化存储,才能方便我们随时查看,因此呢,我们需要把日志存储在文件中.
  • 以上的⽇志都是输出在控制台上的,然⽽在⽣产环境上咱们需要将⽇志保存下来,以便出现问题之后追溯问题,把⽇志保存下来的过程就叫做持久化

5.1 配置日志文件路径

# 设置⽇志⽂件的⽬录
logging:
  file:
    path: D:\\aaa

5.2 配置日志文件名称

logging:
  file:
    name: D:\\aaa\\log.log

注意一级标签一个yml文件往往只能写一次,什么意思呢?通过下图大家可以得出,这是yml专门这样设置的.减少冗余度,两条归属于同一个一级标签,直接写到一个一级标签下面即可.

在这里插入图片描述

两块代码合并如下:

logging:
  file:
    path: D:\\aaa
    name: D:\\aaa\\log.log

重启服务器,在我们的相应目录下自动生成我们的日志文件.

在这里插入图片描述
以记事本的形式打开,就是我们的日志信息了.

在这里插入图片描述

我们也可以根据不同的日志级别

logging:
  file:
  	path: D:\\aaa
    name: springboot-log.log
  level:
    root: error
    com:
      example:
        demo:
          controller: error
          service: info

6. Lombok 日志输出

Lombok是我们在java中经常使用的东西,大家一定要去掌握常见的东西.

  1. pom.xml中添加Lombok依赖
<dependency>
<groupId>org.projectlombok</groupId>
 <artifactId>lombok</artifactId>
 <version>1.18.20</version>
 <optional>true</optional>
</dependency>
  1. @Slf4j注解控制日志

使⽤ @Slf4j 注解,在程序中使⽤ log 对象即可输⼊⽇志,并且只能使⽤ log 对象才能输出,
这是 lombok 提供的对象名,人家规定的,还是那句话,没有那么多为什么哈哈!!!

package com.example.demo;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@RequestMapping("/user6")
@Controller
@ResponseBody // 用来设置当前类中所有的方法返回的是数据而非页面
@Slf4j
public class User6 {
    @RequestMapping("/log")
    public String sayHi() {
        // 写日志
        log.trace("我是 trace");
        log.debug("我是 debug");
        log.info("我是 info");
        log.warn("我是 warn");
        log.error("我是 error");
        System.out.println("日志打印完成.");
        return "Hi,叶良辰.";
    }
}

在这里插入图片描述

通过浏览器进行访问页面,仍然能得到我们的日志信息.

在这里插入图片描述

我们的日志文件中也会存在日志信息:

在这里插入图片描述

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

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

相关文章

7.4_2B树的插入删除

我们先设置根节点 我们再往里面插入关键字 比如说&#xff1a;80 中间位置为49&#xff1a;&#xff08;5/2&#xff09;向上取整为3 新元素一定要插入到最底层”终端结点“&#xff0c;用”查找”来确定插入位置。 失败节点&#xff08;叶子节点不属于同一层&#xff09; 讲…

Vue-全局事件总线(GlobalEventBus)

全局事件总线(GlobalEventBus) 全局事件总线是vue中特别厉害的一种组件中通信的方式&#xff0c;它可以实现任意组件中通信&#xff0c;随便拿出来两个组件就能互通数据&#xff0c;就像对讲机一样&#xff0c;它在开发中用的也是特别的多 1 编写案例 首先准备两个组件&…

Python列表 (超详细举例加讲解)

得之我幸&#xff0c;失之我命 文章目录 1.列表的值 2.列表的定义 3.下标 4.列表长度 5.列表的加法和乘法 6.列表切片 7.操作方法&#xff08;一些基础的函数&#xff09; &#xff08;1&#xff09;append——向列表末尾添加元素 &#xff08;2&#xff09;insert——…

VUE3实现页面缓存,tab切换时不刷新

如上图所示&#xff0c;为了实现页面缓存&#xff0c;防止每次页面切换时重新刷新数据&#xff0c;前前后后尝试了多种写法&#xff0c;如上图被注释的那段写法&#xff0c;与没注释掉的写法&#xff0c;在router-view上主要是第一种写法有设置key属性&#xff0c;第二种没有&a…

常见面试题之框架篇

1.Spring框架中的单例bean是线程安全的吗&#xff1f; 不是线程安全的&#xff0c;是这样的。 当多用户同时请求一个服务时&#xff0c;容器会给每一个请求分配一个线程&#xff0c;这是多个线程会并发执行该请求对应的业务逻辑&#xff08;成员方法&#xff09;&#xff0c;…

模拟电路系列分享-负反馈电路稳定性分析

目录 概要 整体架构流程 技术名词解释 1.负反馈放大电路产生自激震荡的条件 2.从实际运放的幅频&#xff0c;相频特性看自激振荡的可能性 小结 概要 在卡拉0K歌厅中,我们会见到这样一种现象:当麦克风位置不合适或者音量过大时, 喇叭中会出现一种非常难听的啸叫,捂住麦克风、赶紧…

【无需显卡】AI绘画入门教程

前言 Hello&#xff0c;各位端午节快乐呀&#xff01;不好意思拖更两个月&#xff0c;最近实在是太忙了&#xff0c;也想不到有什么好玩的&#xff0c;之前介绍过了几个好玩的ai网站&#xff0c;非常适合新手尝鲜&#xff0c;但很多都有额度限制&#xff0c;而且还开始收费了&…

【C语言】内存你知多少?详解C语言动态内存管理

目录 一&#xff0c; 计算机中的内存 二&#xff0c;动态内存申请函数 2.1 头文件 2.2 malloc函数 2.3 free函数 2.3 calloc函数 2.4 realloc函数——调整空间函数 情况1&#xff1a;原有空间之后有足够大的空间 情况2&#xff1a;原有空间之后没有足够大的空间 2…

Android大图加载优化方案,避免程序OOM

我们在编写Android程序的时候经常要用到许多图片&#xff0c;不同图片总是会有不同的形状、不同的大小&#xff0c;但在大多数情况下&#xff0c;这些图片都会大于我们程序所需要的大小。比如微博长图&#xff0c;海报等等。所以我们就要对图片进行局部显示。 大图加载基本需求…

信号与系统复习笔记——信号与系统的时域和频域特性

信号与系统复习笔记——信号与系统的时域和频域特性 傅里叶变换的模和相位表示 一般来说&#xff0c;傅里叶变换的结果是复数&#xff0c;所以能够使用模和相位来表示&#xff0c;具体的有&#xff1a; X ( j ω ) ∣ X ( j ω ) ∣ e j ∡ X ( j ω ) X(j\omega) |X(j\ome…

浅尝Transformer和LLM

文章目录 TransformerTransformer的衍生BERTPre-trainingBERT与其他方法的关系怎么用BERT做生成式任务&#xff1f; GPTPre-trainingFine-Tuning Transformer工具开源库特点 LLM系列推理服务 大语言模型势不可挡啊。 哲学上来说&#xff0c;语言就是我们的一切&#xff0c;语言…

MySQL 高级(进阶) SQL 语句

创建两个表格 use awsl; create table location (Region char(20),Store_Name char(20)); insert into location values(East,Boston); insert into location values(East,New York); insert into location values(West,Los Angeles); insert into location values(West,Houst…

JMU20 软件工程经济学 复习总结

文章目录 碎碎念0. 基准收益率 i1. 现金流量图2. 净现值 NPV&#xff0c;内部收益率 IRR3. 单利&#xff0c;复利计算4. 等额年金NAV5. 动态回收期 P t ′ P_t Pt′​6. 固定资产折旧 [书P44]7. 增值税8. 软件行业增值税的即征即退9. 利息备付率 ICR&#xff0c;偿债备付率 DSC…

C语言之分支与循环

一、语句 什么是语句 C语言中&#xff0c;由一个分号&#xff08; &#xff1b;&#xff09;隔开的即为一条语句。 这些都是语句&#xff1a; &#xff08; 一行里只有 &#xff1b;的语句&#xff0c;我们称其为 “空语句” &#xff09; int main(void) {printf("hel…

UVM1.2究竟在UVM1.1上做了哪些升级

想必大家平时也没有很注意UVM1.1版本和UVM1.2版本的不同之处&#xff0c;只有在用一些以前UVM1.1能支持的功能&#xff0c;到了UVM1.2却出现编译报错&#xff0c;找不到对应的变量或者函数或者类的时候&#xff0c;才意识到这两个版本的差异。笔者也是遇到了1个打印问题&#x…

利用Django的视图类TemplateView将模板、视图与模板变量方便快速的整合在一起

TemplateView是Django提供的通用视图类之一&#xff0c;它允许您在不编写任何Python代码的情况下将模板与视图关联起来。下面是关于TemplateView类的一些介绍&#xff1a; 渲染模板&#xff1a;TemplateView负责渲染指定的模板并返回生成的HTML响应。您只需提供模板名称或路径即…

华为OD机试真题B卷 Java 实现【删除字符串中出现次数最少的字符】,附详细解题思路

一、题目描述 删除字符串中出现次数最少的字符&#xff0c;如果多个字符出现次数一样则都删除。 二、输入描述 一个字符串。 三、输出描述 删除字符串中出现次数最少的字符&#xff0c;如果多个字符出现次数一样则都删除&#xff0c;如果都被删除 则换为empty。 四、解题…

【安装lnmp实操】

文章目录 一、安装Nginx服务1.安装依赖包2、创建运行用户3、编译安装4、优化路径5、添加 Nginx 系统服务 二、【安装 MySQL 服务】1、安装Mysql环境依赖包2、创建运行用户3、编译安装4、修改mysql 配置文件5、更改mysql安装目录和配置文件的属主属组6、设置路径环境变量7、初始…

MySQL数据库高级SQL语句(图文详解!)

一、MySQL高级语句 1.SELECT 2.DISTINST 3.WHERE 4.AND|OR ​5.IN 6.BETWEEN 7.通配符 8.LIKE 9.ORDER BY 10.函数 &#xff08;1&#xff09;数学函数 &#xff08;2&#xff09;聚合函数 &#xff08;3&#xff09;字符串函数 11.GROUP BY 12.HAVING 13.别名 14.子查询 …

团体程序设计天梯赛-练习集L1篇③

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的普通人。 &#x1f3c0;个人主页&#xff1a;陈童学哦CSDN &#x1f4a1;所属专栏&#xff1a;PTA &#x1f381;希望各…