JavaEE >> Spring Boot 日志

2024-05-05 18:04
文章标签 java ee spring boot 日志

本文主要是介绍JavaEE >> Spring Boot 日志,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

日志的作用以及什么是日志

日志就是为了当程序出错的时候,程序员们可以通过日志看到是哪部分出现错误了,为了发现和定位问题。当然,我们还可以通过日志实现一些功能,如下:

  • 记录系统的操作⽇志,⽅便数据恢复和定位操作⼈;
  • 记录程序的执⾏时间,⽅便为以后优化程序提供数据⽀持;
  • 记录⽤户登录⽇志,⽅便分析⽤户是正常登录还是恶意破解⽤户等。

在 Spring Boot 中,内置了日志框架(Slf4j),即让程序运行时可以通过控制台输出日志:
在这里插入图片描述
既然 Spring Boot 内置了日志框架,那么就可以通过框架来实现自定义日志的打印。

补充:
日志框架分为:日志门面、日志实现

  1. 日志门面框架:commons-logging、SLF4J. 这是日志的入口,是抽象层,不是具体的实现
  2. 日志实现框架:log4j、log4j2、JUL、logback. 这是日志的具体实现

在项目中,通常使用 日志门面 + 日志实现 实现日志。

自定义日志打印

分为两步:

  1. 在程序中得到日志对象;
  2. 使用日志对象打印日志。

代码实现:

@RestController
@RequestMapping("/log")
public class UserController {// 1. 得到日志对象private static final Logger logger = LoggerFactory.getLogger(UserController.class); // 通常为该类的类对象@RequestMapping("/getLog")public String printLog(){System.out.println("不使用日志对象打印日志");// 2. 通过日志对象打印日志logger.info("<<< 使用日志对象打印日志>>>");return "success";}
}

在引入 Logger 接口和 LoggerFactory 类的时候需要注意引入 slf4j 这个包:

在这里插入图片描述

得到的输出结果如下:
在这里插入图片描述

日志是一长串的,它们分别都有不同的意思,格式如下:
在这里插入图片描述

其中,日志级别也是可以自己设定打印级别的,比如一些日志不太重要,当为默认日志级别(INFO)的话,在控制台中就会输出很多日志,当我们排查的时候就会产生干扰,此时可以通过设置不同的日志级别来提高我们维护以及判断正误的效率。下面将介绍都有哪些日志级别,以及如何使用。

日志级别

日志级别分为六种(从低到高):

  1. trace:微量,少许的意思,追踪信息,级别最低;
  2. debug:需要调试时候的关键信息打印;
  3. info:普通的打印信息(默认⽇志级别);
  4. warn:警告,不影响使⽤,但需要注意一些问题;
  5. error:错误信息,级别较⾼的错误⽇志信息,一般不影响系统继续运行;
  6. fatal:致命的,因为代码异常导致程序退出执⾏的事件,需要立即被处理的系统级错误。

Spring Boot 默认的日志级别就是 INFO 级别,即在控制台只会报告 info、warn、error、fatal 这几种级别的日志。

设置日志级别

1. 通过配置文件进行设置(yml、properties)

logging.level.root =error  // properties 配置文件设置日志级别.  此处设置一个 error 级别的日志    

当项目启动时,就只会出现 error 和 fatal 级别的日志(此处由于项目启动是正常的,就不会出现该日志):
在这里插入图片描述
yml 配置项:

logging:level:root: debug

就会发现输出了 debug 及以上级别的日志:
在这里插入图片描述

2. 通过日志框架进行设置

@RestController
@RequestMapping("/log")
public class UserController {// 1. 得到日志对象private static final Logger logger = LoggerFactory.getLogger(UserController.class); // 通常为该类的类对象@RequestMapping("/getLog2")public  String printLog2(){// 2. 通过日志对象打印日志logger.debug("<<< debug 级别日志>>>");logger.error("<<< error 级别的日志>>>");logger.trace("<<< trace 级别的日志>>>");logger.warn("<<< warn 级别的日志>>>");logger.info("<<< info 级别的日志>>>");return "success";}
}

运行结果如下:
在这里插入图片描述
此时就会发现只出现了三种级别的日志,info、warn、error,没有出现 trance、debug,这就是 Spring Boot 的默认日志级别捣鬼,当我们没有设置默认日志级别时项目是 info 级别的,而 info 级别的日志不会输出 trance、debug 级别的日志,这也就说明了控制台为什么只输出上述三种级别的日志了。
接下来当我们通过配置文件设置项目默认日志级别为 debug,再次运行项目就会发现:

在这里插入图片描述

小结:当我们需要输出低级别的日志时(相比于 info),需要先在配置项里面配置默认日志输出级别,然后通过日志框架自定义日志级别才能完整的输出。

日志持久化

我们在项目中日志的输出都是在控制台上面的,而控制台伴随着项目重启就清除了,日志就没有了。在这里 Spring Boot 提供了可以让日志保存在硬盘里面的方法。

通过配置配置文件(yml、properties)

在项目中,可以通过在 yml 或者 properties 中配置持久化路径来保存日志:

# 日志的配置
logging:level:root: info  # root 表示根目录,即整个项目的日志级别file:path: logger/  # 配置日志路径

在这里插入图片描述
也可以通过 name 属性来配置文件路径(绝对路径和相对路径都可)以及文件名称:

  1. 不设置路径,只设置名称:
# 日志的配置
logging:level:root: info  # root 表示根目录,即整个项目的日志级别file:path: logger/  # 配置日志路径name: test.log # 配置日志名称

在这里插入图片描述
就会保存在项目的根目录。

注意:
在这里插入图片描述

  1. 设置路径和名称:
# 日志的配置
logging:level:root: info  # root 表示根目录,即整个项目的日志级别file:#path: logger/  # 配置日志路径name: logger111/test.log # 配置日志路径及名称. 此处也可以设置绝对路径

在这里插入图片描述

日志文件分割

在配置文件里面进行配置(yml),如下:

# 日志的配置
logging:level:root: info  # root 表示根目录,即整个项目的日志级别file:path: logger/  # 配置日志路径name: logger111/test.log # 配置日志路径及名称logback:   # 设置日志分割rollingpolicy:file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i  # 分割的格式max-file-size: 3KB  # 满足多大进行分割

在这里插入图片描述
当运行项目的时候,日志文件大小达到 3 KB 的时候就会自动将日志文件进行分割,分割出来的日志文件会根据你在项目中设置的分割格式进行命名。

此处的 3 KB 不一定为 3 KB ,因为它是按一条一条的日志进行分割的,总不能因为分割半条日志而文件大小到了就不分割了,会保证日志的完整性。
此处只是简单介绍日志文件相关配置项,更多可以查看 Spring 官网。

在这里插入图片描述

更简单的日志输出(lombok @Slf4j)

上述对于日志的输出都需要两步(一是得到日志对象,二是根据日志对象进行输出),这样输出日志的时候,在每个类中都要先获取到该类的日志对象,就比较麻烦,而在引用 lombok 中的 @Slf4j 注解后,就不需要获取每个类的日志对象了。

首先需要现在 pom.xml 中引入 lombok 的依赖:

		<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>

然后通过注解输出日志即可,代码如下:
其中引入注解的时候需要引入 lombok 中的 @Slf4j 注解:
在这里插入图片描述

@Slf4j
@RestController
@RequestMapping("/log2")
public class UserController2 {@RequestMapping("/getLog")public  String printLog(){log.debug("<<< debug 级别日志>>>");log.error("<<< error 级别的日志>>>");log.trace("<<< trace 级别的日志>>>");log.warn("<<< warn 级别的日志>>>");log.info("<<< info 级别的日志>>>");return "success";}
}

启动项目,运行就可以将日志的输出了:
在这里插入图片描述

lombok 实现日志输出原理解释:
Java 程序在运行的时候首先是将用户写的代码(即 .Java 文件),编码成字节码文件(即 .class 文件),然后再通过 JVM 进行加载和运行。而 @Slf4j 这个注释就是在将 .Java 文件编码成 .class 文件后,生成了上述得到日志对象这样的代码,如下:

在这里插入图片描述
其实实际上还是通过两步来输出日志的(得到日志对象,通过日志对象进行输出)。
其中 .class 文件都会在 target 目录中:
在这里插入图片描述

这篇关于JavaEE >> Spring Boot 日志的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/962322

相关文章

学习java第七十一天

DI:依赖注入 依赖注入是spring容器中创建对象时给其设置依赖对象的方式,比如给spring一个清单,清单中列出了需要创建B对象以及其他的一些对象(可能包含了B类型中需要依赖对象),此时spring在创建B对象的时候,会看B对象需要依赖于哪些对象,然后去查找一下清单中有没有包含这些被依赖的对象,如果有就去将其创建好,然后将其传递给B对象;可能B需要依赖于很多对象,B创建之前完全不需要知道其他

Java byte数据类型

在Java中,byte是一种基本的数据类型,用于表示整数值。它是8位带符号的二进制补码,范围从-128到127(包括)。 以下是一些关于byte数据类型的重要信息: 大小和范围:byte数据类型占用8位(1字节)内存空间。范围为-128到127。 默认值:在声明一个byte变量时,如果没有给它赋初值,那么它的默认值是0。 用途:通常用于节省内存空间,特别是在大量数据需要存储时,或者在涉及

我碰到的Java实习面试题集合

面试公司:今日头条,阿里巴巴,远景能源,腾讯,天数,上海星环科技。 一、Java基础 ArrayList和LinkedList的区别?(链表和数组的优缺点) 答:ArrayList是一个动态的数组结构,而LinkedList是双向链表结构;存取数据的时候,ArrayList更适合按位随机存取,而LinkedList更适合顺序读存取;插入/删除数据时,ArrayList的开销就比Linked

1、什么是 Java 虚拟机?为什么 Java 被称作是“平台无关的编程语言”?

本文为转载,好记性不如烂笔头 1、什么是 Java 虚拟机?为什么 Java 被称作是“平台无关的编程语言”? Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被编译成能被 Java 虚拟机执行的字节码文件。 Java 被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java 虚拟机让这个变为可能,因为它知道底层硬件平

JVM内存结构 —— Java内存模型 ——Java对象模型

注明:转载. JVM内存结构、Java内存模型和Java对象模型,这就是三个截然不同的概念,但是很多人容易弄混。

JVM原理及性能调优

注明:转载文章。好记性不如烂笔头呀~ 一、什么是JVM     JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少

JavaScript-输入输出语句

输出语句 document.write(' 输出的内容 ') 语法:document.write(' 输出的内容') 作用:内容会显示在网页上 如果输出的内容是标签,也会被解析为网页元素 代码: <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="wid

LeetCode算法题:11. 盛最多水的容器(Java)(双指针问题总结)

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 提示: n == height.length2 <= n <= 10^50 <= height[i] <= 10^4 解题思路: 定义两个指针

基于java的超级玛丽游戏的设计与实现(论文 + 源码)

Java的超级玛丽游戏.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89313347 基于java的超级玛丽游戏的设计与实现 摘要 近年来,Java作为一种新的编程语言,以其简单性、可移植性和平台无关性等优点,得到了广泛地应用。J2SE称为Java标准版或Java标准平台。J2SE提供了标准的SDK开发平台。利用该平台可以开发J

Spring时间触发器

而在Spring里很好的集成了Quartz,在xml文件里面配一下时间就可以自动执行,不需要写一行代码。   Xml代码   <bean id="methodInvokingJobDetail"      class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">