Spring Boot 日志文件有什么用

news/2024/11/29 4:32:04/

目录

一、自定义打印日志

1.1 日志框架说明

1.2 实现自定义打印日志

1.3 日志的格式说明

2.1 日志的级别

2.2 设置日志级别的作用:

2.3 如何设置日志的级别

二、 日志的持久化

3.1 设置日志保存路径  (在 .yml 配置文件中设置日志保存路径)

3.2 设置指定日志文件名称

3.3 日志如何进行清理

三、更简单的日志输出 -- Lombok

4.1 使用注解:@Slf4j


前言

    日志是一个程序必不可少的部分,如果程序在运行的过程中报错了,此时可以通过记录错误日志和警告日志 快速的定位问题并且找到问题原因。

    日志除了定位问题之外,还有以下功能:

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

一、自定义打印日志

当启动一个 Spring Boot 项目时,默认就有日志的输出,如下图:

     上图就是 Spring Boot 输出的控制台的信息,所以,Spring Boot 中内置了日志框架,否则不会输出日志,并且输出的日志不是程序猿打印的,如何自定义打印日志;最后:默认是显示在控制台上的,如果项目重启了,此时日志也就消失了,那如何将日志进行持久化方便开发人员去查找呢?

1.1 日志框架说明

    日志框架也是有很多种的,JUL,log4j... 每个日志的框架实现的方式都是不一样的,所以如果每个日志框架都要系统的学习,成本就很高,因此为了减少开发过程中的学习成本,此时就引入了日志门面:SLF4J。

    和JDBC 编程是一样的,当有很多套规范的时候,各种数据库连接就麻烦了很多,需要学习不同数据库提供的不同的接口,学习成本很高,此时就引入了 JDBC 编程 去对接不同的数据库的接口,最后程序猿只需要学习 JDBC 编程之后就可以连接到不同的数据库;SLF4J也是同样的,日志的框架有很多,最后只需要学习 SLF4J 就可以对接到不同的日志框架了,相当于是一个总的接口。

1.2 实现自定义打印日志

1. 得到日志对象
private static final Logger log =LoggerFactory.getLogger(TextController.class);

注:(1)Logger 对象是 SLF4J提供的对象,导包时需要                   注意.

      (2)Logger 对象的参数可以是一个类对象,也可以是一个类名(不推荐类名),如果参数是一个类名,打印日志时只会显示类名,如果同一包下有相同的类名,此时的日志信息中就无法区分多个同名的类

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

下图代码所示:

        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");//错误日志

运行结果:

    注:上述的结果是已经设置了日志的级别了,默认的级别是info,所以这个级别以下的日志打印信息,在默认情况下是不会进行打印的,只会输出info以上的级别。

 1.3 日志的格式说明

    可以看到上述日志打印的格式: 时间,级别,线程信息,日志打印的所在类,(在上述创建一个日志对象时传参了一个类对象,此时在打印时就可以拿到这个类)   日志的打印信息

 2.1 日志的级别

(1)trace:痕迹,微量,级别最低,设置后几乎所有的日志信息都会进行打印
(2)debug:开发环境中常用;需要调试时打印的关键信息
(3)info:普通日志的打印,日志的默认级别
(4)error:级别较高,错误的日志打印的信息

(5)fatal:致命的,因代码异常导致程序崩溃时会打印此日志

(注:只会在整个程序都异常时才会打印这个级别,否则默认也是不会打印这个日志的

     日志级别的顺序:

2.2 设置日志级别的作用:

(1)帮开发人员筛选重要的信息,例如:设置级别为 error,此时就可以只关注程序的报错打印的日志了,对于普通的日志和日常的业务中打印的日志可以忽略,更高效的帮助开发人员快速的定位程序的问题。
(2)可以控制在不同的环境下是否需要打印日志,例如:在开发环境中,需要详细的打印日志的调试信息,但是在生产环境中,需要保证性能和安全性就应当尽量减少日志的输出,而开发的调试打印日志就造成了数据污染,所以可以通过设置日志的级别,以控制不同环境中是否需要打印日志。

2.3 如何设置日志的级别

    设置日志的级别是在配置文件中设置,此处演示在 yml 配置文件中如何设置日志的级别。

    日志级别的设置是非常灵活的,可以精确到某一个子文件夹中的某一个类,如下代码:

#  日志级别的设置
logging:level:root: error #将根目录下的文件夹设置error级别com:example:demo:controller: trace   #单独将

    上述设置日志信息打印就是将根目录(root)目录下的文件设置为 error级别的,然后将 demo 包下的 controller 类设置成 trace 级别的(所有的日志信息都打印)

    运行结果:

     可以看到 Spring Boot 项目的启动日志并没有打印(包括端口号和项目启动时间),因为在上述配置文件中已经设置了 root 路径下的所有包下的 日志打印级别为 error,项目的启动日志也是包含在这个包中的,所以 error 以下级别的日志不会进行打印。

    但是在访问 sayHi 方法之后,可以看到 Controller 这个类的所有日志的信息全部都打印了,是因为上述配置文件中的 Controller 类中的日志打印级别为 trace。

二、 日志的持久化

    持久化很常见,在数据库中介绍过 作用就是将数据持久化,io操作中也提到将数据写入文件 也是对数据持久化,日志的持久化也是一样的,就是将日志的信息保存下来,之后方便开发人员查看并定位问题。

3.1 设置日志保存路径  (在 .yml 配置文件中设置日志保存路径)

# 日志保存路径(1. 尽量不要保存在 系统盘(C盘)) (2. 路径中不要出现中文)
logging:file:path: D:\home   #此时只需要将路径写上即可 不用设置目录名,会自动生成名录名的

在 项目启动之后,可以在对应目录中查看是否有日志文件

 访问 sayHi 方法后,可以查看是否会有日志信息覆盖原来的 日志信息:

     首先并没有创建新的日志文件,可以看到原来的日志并没有消失,后来新的日志是在原来的基础上进行了追加操作。

3.2 设置指定日志文件名称

# 日志保存路径(1. 尽量不要保存在 系统盘(C盘)) (2. 路径中不要出现中文)
logging:file:name: D:\\home\\springBoot.log   #此时可以设置写入特定文件,可以包含指定目录,也可以不指定目录,#如果不指定特定目录,创建日志文件是和项目在同一级目录下

     运行结果:

 3.3 日志如何进行清理

     查看 Spring Boot 更多系统配置项,访问官网:https://docs.spring.io/springboot/docs/current/reference/html/application-properties.html#application-properties

可以点击上述网址查看更多配置,可以看到日志文件可以设置最大日志文件大小:

    还有如果超出指定文件大小之后需要重新创建日志文件,那文件名是如何命名的;

    会有指定的文件名的格式来区分 日志文件的日期的,如:在文件名之后 + 数字的形式或者日期的形式来区分 很多的日志文件。

    所以如果日志文件过了很长时间之后,如果没用了就可以删除了。

三、更简单的日志输出 -- Lombok

    在打印日志时每次都需要创建一个日志对象,而且是每个类都要添加一个日志对象,很繁琐,因此有一种更简单的方式实现日志的打印:使用注解 -- @Slf4j 。

4.1 使用注解:@Slf4j

如果在创建 Spring Boot 项目时,起步依赖没有添加 Lombok,此时可以先安装一个插件:

     之后在pom.xml 中添加依赖:

     使用注解方式创建日志对象:

 


http://www.ppmy.cn/news/979153.html

相关文章

ipvs 原理解析(二)netfilter hook

文章目录 netfilter hook netfilter hook 在 __ipvs_vs_init 中有通过 nf_register_net_hooks 注册 hook 函数到 netfilter 框架 如 ipv4 下的 static const struct nf_hook_ops ip_vs_ops[] {/* After packet filtering, change source only for VS/NAT */{.hook ip_vs_…

使用序列化和反序列化函数archivedDataWithRootObject和unarchivedObjectOfClasses的使用和遇到问题及解决方案

为何archiveRootObject和unarchiveObjectWithFile正常,而archivedDataWithRootObject和unarchivedObjectOfClasses一直报错。 [NSKeyedArchiver archiveRootObject:account toFile:path];和c PPAccountModel *account [NSKeyedUnarchiver unarchiveObjectWithFile:…

上海国际智能遮阳与建筑节能展览会火热预约中,这份观展指南请收下

近年来,随着科技的不断进步和人们对环保、节能意识的增强,智能遮阳和建筑节能领域逐渐成为人们关注的热点。智能遮阳和建筑节能技术能够有效降低建筑物的能耗,提高建筑物的环保性能,从而促进行业的蓬勃发展。 同时,物联网、互联网、大数据、云计算....技术不断创新…

基于SpringBoot+vue的医院信管系统设计与实现(源码+LW+部署文档等)

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

ESD门禁管理系统的组成部分

ESD门禁管理系统是一种用于实现门禁控制和管理的系统。这个系统主要通过使用电子身份认证技术,对进入或离开某个区域的人员进行身份验证和控制。ESD门禁管理系统通常包括以下几个主要组成部分: 1. 门禁设备:包括门禁读卡器、门禁闸机等设备&…

【优选算法题练习】day8

文章目录 一、974. 和可被 K 整除的子数组1.题目简介2.解题思路3.代码4.运行结果 二、525. 连续数组1.题目简介2.解题思路3.代码4.运行结果 三、560. 和为 K 的子数组1.题目简介2.解题思路3.代码4.运行结果 总结 一、974. 和可被 K 整除的子数组 1.题目简介 974. 和可被 K 整…

jdk,jre和jvm三者的关系和区别

目录 一、三者的关系 二、JDK的概念 三、JRE的概念 四、JVM的概念 五、三者区别 一、三者的关系 从图中可以清楚地看到,他们之间的关系是JDK包含JRE, JRE又包含JVM。 因此,JDK包含JRE和JVM。 JDK JRE Java 开发工具包 [Java,Javac,Javadoc,Javap…

STP和MTP(第二十二课)

2、如何实现 1)在MSTP网络种,引入了域的概念,称为MST域 2)每一个MST域中包含一个或多个“生成树”称为“实例” 3)每个“实例生成树”都可以绑定vlan,实现vlan数据流的负载分担/负载均衡 4)默认情况下,所有的vlan都属于“实例树0:即:instance 0” 5)不同的“实例…