目录
一、日志的作用
日志是程序的重要组成部分。如果程序报错了,打开控制台查看日志可以帮我们快速的排除和定位问题。除此之外,日志还有以下功能:
记录用户登录信息,方便进行大数据分析,分析用户是正常登录还是恶意破解用户。
记录系统的操作日志,方便数据恢复和定位操作人。
记录程序的执行时间,方便为以后优化程序提高数据支持。
二、日志的使用方法
SpringBoot项目在启动的时候默认就有日志输出。
从上图我们可以看到,SpringBoot内置了日志框架,否则也打印不了日志。默认情况下,输出的日志并非是开发者定义和打印的。同时,日志是默认打印在控制台上的。而控制台的日志是不能被保存的。接下来,将会介绍如何自定义打印日志和保存日志。
三、自定义日志打印
3.1 在程序中得到日志对象
使用LoggerFactory日志工厂来获取日志对象。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static Logger logger = LoggerFactory.getLogger(UserController.class);
日志工厂需要将类的类型传递进去,这样才知道日志的归属类,才能更方便直观的定位到出问题的类。
注意:Logger对象是属于org.slf4j包下的。
3.2 使用日志对象打印日志
打印方式有多种,可以使用info()方法来输出日志。
3.3 日志格式说明
3.4 常见的日志框架说明
日志实现方式:门面模式
门面:slf4j
实现:logback
四、日志级别
4.1 日志分级的作用
日志分级的作用就是为了筛选符合目标的日志信息。有了日志级别以后,就可以过滤自己想看到的信息。举个例子:如果设置日志级别为error,就可以只看程序的报错日志,对于普通的调试日志和业务日志就可以忽略了,从而节省开发者的信息筛选时间。
4.2 日志级别的分类
trace:微量,少许。级别最低。
info:普通的打印信息。
debug:需要调试的时候打印关键信息
warn:警告,不影响使用,但需要注意的问题。
error:错误信息,级别较高的错误日志信息。
fatal:致命的。因为代码异常导致程序退出执行的事件。这个程序员没办法控制。
4.3 日志使用
日志级别控制只需要在配置文件中设置“logging.level”配置项即可。
配置根路径的日志级别:
logging:
level:
root: trace #设置所有目录的日志级别
配置特定目录的日志级别:
logging:
level:
root: info #设置所有目录的日志级别
com:
example:
controller: trace #设置com.example.controller的日志级别
component: error #设置com.example.componet的日志级别
打印日志:
private static Logger logger = LoggerFactory.getLogger(UserController.class);
@RequestMapping("/logger")
public void showLoggerLevel(){
logger.trace("--------------trace------------");
logger.debug("--------------debug------------");
logger.info("----------------info------------");
logger.warn("----------------warn------------");
logger.error("---------------error-----------");
}
不同的日志级别下打印的结果不一样。
如果日志的等级比设置的等级低,那么该日志就会被筛掉。只会输出大于等于当前设置等级的日志。(可以理解为:只有特别严重的事情才会汇报给公司的最高领导)
五、日志持久化
5.1 设置日志的保存路径和文件名
logging:
level:
root: info #设置所有目录的日志级别
file:
path: C:\Users\LIUJIA\Desktop\JAVA # 设置保存日志的路径
name: C:\Users\LIUJIA\Desktop\JAVA\logging.log #设置日志的名称
六、更简单的日志输出
自定义日志打印时,我们需要使用LoggerFactory日志工厂来获取日志对象,并且每个类都需要添加一遍,很麻烦。可以使用lombok完成更简单的输出。
分为两步:
添加Lombok依赖、使用@Slf4j注解输出日志
6.1 添加依赖,输出日志
使用@Slf4j注解,在程序中使用log对象即可输出日志,并且只能使用log对象才能输出,这是lombok提供的对象名。
@Controller
@ResponseBody
@Slf4j
public class UserController {
@RequestMapping("/deflogger")
public void defLogger(){
log.error("-------error-------");
}
}
6.2 Lombok原理解释
Java程序的运行原理如下图:
用户写的代码在src-main-java这个文件夹下,经过编译后,生成字节码文件,生成的字节码文件在target目录下,target目录下的文件结构和java中的文件是一一对应的。通过查看字节码文件,
我们发现有使用LoggerFactory日志工厂来获取日志对象的代码,证明加了@Slf4j注解后,Lombok通过遵循Java编译期增强的规范,实现了看Java源代码在生成字节码时的功能增强,即Lombok实现了这行代码,不需要程序员自己写了。
6.3 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 |
七、总结
日志可以帮助我们更快的定位和发现问题,Spring Boot内置了日志框架,默认情况下使用的是info日志级别将日志输出到控制台的,我们可以使用Lombok提供的@Slf4j注解和log对象快速的打印自定义日志。同时,日志包含trace、info、debug、warn、error、fatal6个级别。日志级别越高,收到的日志信息越少。可以通过设置日志的保存路径和文件名实现日志持久化存储。