日志记录了系统行为的时间、地点、状态等相关信息,能够帮助我们了解并监控系统状态,在发生错误或者接近某种危险状态时能及时提醒我们处理,同时在系统产生问题,能够帮助我们快速定位、诊断问题。
在SpringBoot启动、运行时,控制台中就会输出日志信息:
这些日志都是Spring中已经定义的,并非开发者自定义的日志。
如果想要输出自定义的日志,需要以下步骤:
1.在程序中得到日志对象
2.使用日志对象输出内容
获取日志对象:
private static Logger logger= LoggerFactory.getLogger(UserController.class);
使用日志对象输出内容:
//2.使用日志对象输出信息
logger.info("这是日志记录的信息");
输出:
这是日志记录的信息
这里使用的Logger在slf4j
包下,因为在SpringBoot中内置了slf4j
日志框架,可以直接调用slf4j
来输出日志。
日志有两种框架模式,一个是门面模式,另一个是实现模式。
门面模式也叫外观模式(Facade
),可以理解为是一层封装,对内部的子系统实现的封装,对外提供统一的接口,从而屏蔽了子系统在使用上的不同,大大降低了系统的使用难度,同时提高了系统的可维护性和可扩展性。
真正起作用的是子系统实现,外面的门面框架更像是一个服务人员,只起到对接作用。
常见的门面有两种:JCL(commons-logging)和SLF4j.
常见的实现框架有log4j1/2,jul,logback.
如下图:
SpringBoot底层是Spring,Spring默认使用的日志框架是JCL 门面,而SpringBoot使用的日志框架是SLF4J门面和logback实现日志。
级别:
IOFO是默认的日志级别,我们可以在代码中对日志的级别进行设置,低于设置级别的日志就会被忽略(不显示)。
日志级别设置:
# 日志级别设置
logging:
level:
root: info
不会将日志输出在控制台上,而是将日志保存下来,以便于出现问题的时候进行追溯,这个过程就叫做持久化。
设置日志持久化有两种方式:
1.设置日志的保存路径:
SpringBoot会按照自己的格式来生成日志文件并保存到相应的目录中。
# 日志持久化保存
logging:
file:
path: C:\logs\
level:
root: info
启动SpringBoot后,在C盘logs目录下就会出现日志文件
2.设置日志的保存文件名:
# 日志持久化保存
logging:
file:
name: C:\log\spring-log.log
level:
root: info
运行springBoot,在对应目录下出现自定义文件名的日志:
默认情况下日志有一个最大日志的限制,max-size,当日志文件大小超过这个限制,springBoot就会重新创建一个日志,并进行报错。
SpringBoot默认的日志实现是Lombok,相比于获得日志对象logger打印日志,lombok是更简单的一种方式去打印日志。
使用:
1.添加lombok框架支持
2.使用@slf4j注解输出日志。
在idea中下载插件EditStarters:
在pom.xml中右键,选择Generate,选择刚才下载好的插件
在插件中搜索lombok引入依赖:
在测试类UserService中使用@Slf4j输出日志:
package com.example.demo.model;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
@Service
@Slf4j
public class UserService {
@PostConstruct
private void postConstruct(){
//打印日志
log.error("我是 UserService 的构造方法日志error!");
log.warn("这是一个警告信息日志!");
}
}
lombok本质上是一个工具,可以通过简单的注解形式来帮助我们简化一些必须有的Java代码。
比如我们在输出日志时,如果不使用lombok,需要手动获取日志对象logger,然后调用这个对象的方法。如果使用lombok,只需要加一个@Slf4j注解即可获得一个log对象,然后就可以输出日志。
那@Slf4j注解有啥用?
其实这个注解的作用就是自动帮我们获得logger对象,不需要我们手动创建,简化了代码。
我们编写的Java源代码需要转化成字节码文件进行执行,在idea目录中,target目录下就是所有的字节码文件,在字节码文件中我们查看UserService类:
我们在写java源码时添加一些注解,然后lombok会进一步加工,根据对应的注解自动生成一些代码,然后整个源代码编译成字节码文件,最后在JVM上加载运行,如下图:
lombok通过注解自动生成代码,核心是对注解进行解析,然后才能生成代码。
解析注解有两种方式:
优点:
缺点:
文章参考:
https://blog.csdn.net/ThinkWon/article/details/101392808