1、日志作用
Spring Boot 的日志功能可以帮助开发人员进行应用程序的故障排查、性能优化和追踪等操作。它可以记录应用程序在运行时的各种信息,包括业务日志、错误信息、警告信息、事件信息,还可以记录其他与应用程序相关的一些系统级操作。
具体来说,Spring Boot 日志的作用包括以下几个方面:
-
排错和故障诊断:应用程序在运行时出现异常或错误时,可以通过日志信息中的详细提示信息帮助开发人员快速确定问题所在,缩短故障诊断时间。
-
性能调优:Spring Boot 的日志功能可以记录请求的响应时间、数据库访问时间等信息,帮助开发人员找到应用程序性能瓶颈所在,从而进行性能调优。
-
安全监控:Spring Boot 的日志功能还可以记录一些敏感操作,如用户登录、权限验证等,以便在应用程序受到攻击时进行追踪和监控。
-
遗留代码追踪:在对遗留代码进行维护和升级时,Spring Boot 的日志功能可以帮助开发人员快速定位出问题所在,从而减少代码维护的难度。
综上所述,Spring Boot 日志功能在应用程序开发和运行过程中起到了非常重要的作用。
- SpringBooy内置了日志框架【不然每次启动时怎么会输出一堆日志】
- 默认情况下, 输出的日志并非是开发者自定义的,那怎么自定义打印呢?
- 日志默认是打印在控制台上的,而控制台的日志是不能永久保存的,那怎么保存呢?
答案在下面~
2、自定义日志
先获取日志对象,需要使用日志工厂LoggerFactory
:
注意:Logger对象是属于org.slf4j包下的。
package com.example.demo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
public class UserComponent {
private static final Logger logger = LoggerFactory.getLogger(UserComponent.class);
}
日志工程需要把每个类的类型传递进去,这样打印的时候才知道日志的归属类,方便直观的定位到问题类(也可以自定义名字)。
2.0 使用日志对象来打印日志:
@Component
public class UserComponent {
private static final Logger logger = LoggerFactory.getLogger(UserComponent.class);
@PostConstruct
public void doPostConstruct(){
//打印日志
logger.info("i am info");
logger.error("i am error");
logger.debug("i am debug")
}
}
打印结果:
2.1 日志格式说明
Spring Boot打印的日志格式包含以下信息:
日期时间 日志级别 线程id 线程名 执行的类名 : 日志消息
具体说明如下:
日期时间
:记录日志的日期和时间,通常以yyyy-MM-dd HH:mm:ss,SSS
格式显示。日志级别
:表示日志的级别,包括TRACE
、DEBUG
、INFO
、WARN
和ERROR
等级别。线程id
:显示执行日志的线程id。线程名
:显示执行日志的线程的名称。执行的类名
:显示记录日志的类或组件的名称。日志消息
:实际的日志内容。
需要注意的是,Spring Boot的默认日志格式可以通过修改Logback配置文件来进行自定义。你可以根据自己的需求调整日志输出的格式和内容。
3、日志级别
日志级别的作用: Spring Boot的日志级别用于控制日志的输出级别,可以根据不同的需求和环境来设置适当的日志级别,以便在开发、测试和生产等阶段进行灵活管理和调试,快速筛选重要的信息。
比如设置日志级别为error,那么就可以只看程序的报错日志了,对于普通的调试日志和业务日志就可以忽略掉,从而节省开发者筛选信息的时候。
以下是几个常见的日志级别:
- TRACE(最低级别): 用于记录程序执行的详细信息,包括很多调试信息,一般在开发和排查问题时使用。
- DEBUG: 用于记录调试信息,一般用于开发和调试阶段,可以帮助开发人员了解程序的运行状态,定位问题等。
- INFO : 用于记录应用程序的运行信息,如应用启动、关键操作的执行等。通常用于生产环境的正常运行日志。
- WARN: 用于记录可能会引起问题的信息,但并不影响程序运行的情况。例如,废弃的方法的使用,配置项的错误等。
- ERROR: 用于记录错误和异常信息,表示出现了错误情况,但程序仍然能继续运行。这些错误可能需要被关注和处理。
- FATAL(最高级别): 用于记录严重错误,表示系统无法继续运行,需要立即进行修复或停止程序运行。
3.1 、 日志级别设置
**日志级别配置只需要在配置文件中设置logging.level
配置项即可,如果设置了warn
,那么只能打印warn 、 error、fatal
级别的日志,warn
以下等级的日志将不会打印。**日志的默认输出级别是 info
。
在Spring Boot中,可以通过以下方式进行日志级别的设置:
-
在配置文件中设置全局日志级别:
在
application.properties
文件中添加以下配置:logging.level.root=INFO
或者在
application.yml
文件中添加以下配置:logging: level: root: INFO
将
root
(根路径)设置为你希望的日志级别,如INFO
、DEBUG
等。这将会应用于所有的日志记录器。 -
设置特定包或类的日志级别:
在上述的配置文件中,你还可以为特定的包或类设置不同的日志级别。例如,要将某个包下的日志级别设置为DEBUG,可以按照以下方式配置:
logging.level.com.example.package=DEBUG
logging:
level:
com.example.package: DEBUG
上述配置将会将com.example.package
包下的日志级别设置为DEBUG
。
4、日志持久化
要把日志进行持久化,需要在配置文件中指定日志的存储目录或者指定日志保存文件名,Spring Boot就会把控制台的日志写进相应的目录或者文件下。
配置日志存储路径:
-
在
application.properties
文件中进行配置:logging.file.name=logs/mylog.log
上述配置将会将日志保存在项目根目录下的"logs"文件夹中,并命名为"mylog.log"。
-
在
application.yml
文件中进行配置:logging: file: name: logs/mylog.log
使用上述配置,同样会将日志保存在项目根目录下的"logs"文件夹中,并命名为"mylog.log"。
-
使用绝对路径配置日志保存路径:
如果你希望将日志保存到特定的绝对路径,而不是项目根目录下的相对路径,可以使用以下方式进行配置:
logging.file.path=/path/to/logs/
logging.file.name=mylog.log
或者使用application.yml
:
logging:
file:
path: /path/to/logs/
name: mylog.log
将/path/to/logs/
替换为你希望保存日志的绝对路径。
- 无论使用相对路径还是绝对路径,Spring Boot会自动创建日志文件和目录(如果它们不存在),并将日志记录写入指定的文件中。
除了以上方式,你还可以使用其他第三方日志框架提供的配置选项来指定日志保存路径,例如Logback或Log4j。这些框架通常有自己的配置文件,你可以在其中指定日志保存路径的相关设置。
需要注意的是,为了确保应用程序在不同环境中都能正确记录日志,并且避免可能的权限问题,建议使用相对路径配置日志保存路径。
4.1 设置日志存储大小
系统默认最大存储大小是:10MB
-
在
application.properties
文件中进行配置:logging.file.name=logs/mylog.log logging.file.max-size=100MB
上述配置将会将日志保存在项目根目录下的"logs"文件夹中,并将日志文件的最大大小设置为100MB。
-
在
application.yml
文件中进行配置:logging: file: name: logs/mylog.log max-size: 100MB
使用上述配置,同样会将日志保存在项目根目录下的"logs"文件夹中,并将日志文件的最大大小设置为100MB。通过以上配置,或者就算不配置,当日志文件达到指定的最大大小后,Spring Boot会自动创建一个新的日志文件来存储后续的日志记录。
- 当日志存储大小到达额定值时,会自动创建新的文件,至于文件名是什么,springBoot有自己的命名规则。比如在本身名字后面加上-1、-2…。
5、 更简单的日志输出:lombok
使用lombok来更简单的输出日志:
- 添加lombok框架支持:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<optional>true</optional>
</dependency>
- 使用@slf4j注解输出日志:
使用@Slf4j
注解后,你不需要显示地创建一个Logger实例,SLF4J会根据当前类的名称自动为你生成一个合适的Logger对象。
- 在类文件的导入部分添加以下代码:
import lombok.extern.slf4j.Slf4j;
- 在类上方使用
@Slf4j
注解,如:
@Slf4j
public class MyClass {
// ...
}
- 在需要输出日志的地方,使用
log
对象调用相应的日志级别方法【log是固定的,只有使用log对象才能输出日志】例如:
@Slf4j
public class MyClass {
@PostConstruct
public void doPostConstruct(){
log.debug("Debug message");
log.info("Info message");
log.warn("Warning message");
log.error("Error message");
}
// ...
}
SLF4J是一个简单的日志门面(Facade),它提供了统一的日志接口,可以与不同的日志实现框架(如Logback、Log4j等)进行集成和切换。通过使用@Slf4j
注解,你可以轻松地在类中引入一个名为"log"的对象,并使用它来输出日志信息。
5.1、 lombok原理
target目录为项目最终执行的代码:
原先类上的@Slf4j注解在编译时已经更换为普通的代码了。
Java程序运行原理:
Java程序运行的基本流程是:编写Java源代码 -> 编译成Java字节码 -> JVM加载和执行字节码 -> 进行内存管理和垃圾回收 -> 输出执行结果。
lombok运行原理:
- 编译时注解处理器(Annotation Processor): Lombok基于 Java 的注解处理器功能。在编译 Java 代码时,Lombok的注解处理器会扫描源代码中标记了特定注解(例如
@Getter
、@Setter
、@ToString
等)的元素(如类、字段、方法等),并根据注解所指定的规则生成对应的代码。 - AST(Abstract Syntax Tree)转换: Lombok的注解处理器会使用特定的AST转换技术,将源代码解析为语法树表示。然后,在该语法树上进行修改和转换操作,生成新的代码片段。
- 修改源代码: Lombok通过修改源代码的方式来实现自动生成代码。在注解处理期间,Lombok会根据规则生成新的代码片段,并将其插入到源代码中的相应位置。
- 编译生成的代码: 在完成源代码的修改后,编译器会继续编译包含了Lombok注解的源代码。此时,编译器会检测到生成的代码,并将其与手写的代码一起编译为最终的字节码文件。
- 运行时的效果: 生成的代码将在程序运行时发挥作用。例如,
@Getter
注解会在编译期间自动生成相应的getter方法,在运行时可以通过调用这些方法来获取字段的值。
总结来说,Lombok利用 Java 的注解处理器机制,通过在编译期间修改源代码并生成新的代码片段,实现了自动化地生成常见代码的目的。 lombok是一个编译框架。
手写时的代码:
最终的字节码:
所以说lombok根本不会影响运行效率,因为在运行时lombok已经没了,取而代之的是普通的代码片段。
5.2、 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 |