1.日志有什么用?
⽇志是程序的重要组成部分,想象⼀下,如果程序报错了,不让你打开控制台看⽇志,那么你能找到报 错的原因吗? 答案是否定的,写程序不是买彩票,不能完全靠猜,因此⽇志对于我们来说,最主要的⽤途就是发现和定位问题。
除了发现和定位问题之外,我们还可以通过⽇志实现以下功能:
记录⽤户登录⽇志,⽅便分析⽤户是正常登录还是恶意破解⽤户。
记录系统的操作⽇志,⽅便数据恢复和定位操作⼈。
记录程序的执⾏时间,⽅便为以后优化程序提供数据⽀持。
以上这些都是⽇志提供的⾮常实⽤的功能。
2.⽇志怎么用
Spring Boot 项⽬在启动的时候默认就有⽇志输出,如下图所示:
以上内容就是 Spring Boot 输出的控制台⽇志信息。 通过上述⽇志信息我们能发现以下 3 个问题:
- Spring Boot 内置了⽇志框架(不然也输出不了⽇志)。
- 默认情况下,输出的⽇志并⾮是开发者定义和打印的,那开发者怎么在程序中⾃定义打印⽇志呢?
- ⽇志默认是打印在控制台上的,⽽控制台的⽇志是不能被保存的,那么怎么把⽇志永久的保存下来 呢?
3.⾃定义⽇志打印
开发者⾃定义打印⽇志的实现步骤:
1、在程序中得到⽇志对象。
2、使⽤⽇志对象的相关语法输出要打印的内容
3.1 在程序中得到⽇志对象
在程序中获取⽇志对象需要使⽤⽇志⼯⼚ LoggerFactory,如下代码所示:
private Logger logger = LoggerFactory.getLogger(LoggerFactory.class);
注意:Logger 对象是属于 org.slf4j 包下的,不要导⼊错包。
因为 Spring Boot 中内置了⽇志框架 Slf4j,所以咱们可以直接在程序中调⽤ slf4j 来输出⽇志。
常⻅的⽇志框架说明
3.2 使⽤⽇志对象打印日志
⽇志对象的打印⽅法有很多种,我们可以先使⽤ info() ⽅法来输出⽇志,如下代码所示:
@PostConstruct
public void postConstruct(){
logger.info("第一条日志信息");
}
3.3 日志格式说明 ![](https://img-blog.csdnimg.cn/0a0a931ba9bc4c5fa67451bbcd8b93ef.png)
4.日志级别
4.1 日志级别有什么用?
- ⽇志级别可以帮你筛选出重要的信息,⽐如设置⽇志级别为 error,那么就可以只看程序的报错⽇ 志了,对于普通的调试⽇志和业务⽇志就可以忽略了,从⽽节省开发者信息筛选的时间。
- ⽇志级别可以控制不同环境下,⼀个程序是否需要打印⽇志,如开发环境我们需要很详细的信息, ⽽⽣产环境为了保证性能和安全性就会输⼊尽量少的⽇志,⽽通过⽇志的级别就可以实现此需求。
4.2 日志级别的分类与使用
⽇志的级别分为:
- trace:微量,少许的意思,级别最低;
- debug:需要调试时候的关键信息打印;
- info:普通的打印信息(默认⽇志级别);
- warn:警告,不影响使⽤,但需要注意的问题;
- error:错误信息,级别较⾼的错误⽇志信息;
- fatal:致命的,因为代码异常导致程序退出执⾏的事件。
⽇志级别的顺序:
越往上接收到的消息就越少,如设置了 warn 就只能收到 warn、error、fatal 级别的⽇志了。
默认日志输出级别
清除掉配置⽂件中的⽇志设置,观察控制台输⼊的⽇志级别。
得到以下结论,⽇志的输出级别,默认是 info
@PostConstruct
public void postConstruct(){
logger.trace("微量");
logger.debug("调试");
logger.info("普通:第一条日志信息");
logger.warn("警告");
logger.error("错误");
}
日志级别设置
⽇志级别配置只需要在配置⽂件中设置“logging.level”配置项即可,如下所示:
logging:
level:
root: debug
5.日志持久化
以上的⽇志都是输出在控制台上的,然⽽在⽣产环境上咱们需要将⽇志保存下来,以便出现问题之后追 溯问题,把日志保存下来的过程就叫做持久化。
想要将⽇志进⾏持久化,只需要在配置⽂件中指定⽇志的存储⽬录或者是指定⽇志保存⽂件名之后, Spring Boot 就会将控制台的⽇志写到相应的⽬录或⽂件下了。
配置日志文件的保存路径:
# 设置⽇志⽂件的⽬录
logging:
file:
path: D:\temp\
日志文件是追加的形式,这种情况,日志文件会越来越大
logging:
level:
root: warn
# 设置⽇志⽂件的⽬录
file:
path: D:\temp\
logback: # 配置日志文件大小
rollingpolicy:
max-file-size: 1KB
file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i #分割后日志文件名称
配置日志文件的文件名:
logging:
file:
name: spring.boot
6.更简单的日志输出—lombok
每次都使⽤ LoggerFactory.getLogger(xxx.class) 很繁琐,且每个类都添加⼀遍,也很麻烦,这⾥讲⼀ 种更好⽤的⽇志输出⽅式,使⽤ lombok 来更简单的输出。
1. 添加 lombok 框架⽀持。 2. 使⽤ @slf4j 注解输出⽇志。
6.1 添加 lombok 依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
6.2 输出日志
package com.example.springbootdemo01.controller;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.annotation.PostConstruct;
@Slf4j
@Controller
public class LogController2 {
@PostConstruct
public void postConstruct(){
log.trace("微量");
log.debug("调试");
log.info("普通:第一条日志信息");
log.warn("警告");
log.error("错误");
}
@RequestMapping("/log")
public String log(){
return "log...";
}
}
注意:使⽤ @Slf4j 注解,在程序中使⽤ log 对象即可输⼊⽇志,并且只能使⽤ log 对象才能输出, 这是 lombok 提供的对象名。
6.3 lombok 原理解释
lombok 能够打印⽇志的密码就在 target ⽬录⾥⾯,target 为项⽬最终执⾏的代码,查看 target ⽬录 如下:
Java 程序的运⾏原理:
Lombok 的作⽤如下图所示:
6.4 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 对象快速的打印⾃定义⽇志,⽇志包含 6 个级别:
- trace:微量,少许的意思,级别最低;
- debug:需要调试时候的关键信息打印;
- info:普通的打印信息;
- warn:警告,不影响使⽤,但需要注意的问题;
- error:错误信息,级别较⾼的错误⽇志信息;
- fatal:致命的,因为代码异常导致程序退出执⾏的事件。
⽇志级别依次提升,⽽⽇志界别越⾼,收到的⽇志信息也就越少,我们可以通过配置⽇志的保存名称或 保存⽬录来将⽇志永久地保存下来。