目录
1. 日志的作用
2. 如何使用日志
3. 自定义日志打印
3.1 获取日志对象
3.2 设置打印的内容
3.3 常见的日志框架
3.4 日志格式说明
4. 日志级别
4.1 日志级别的作用
4.2 日志级别的分类
4.3 日志级别的使用
4.4 设置日志级别
4.5 分目录设置日志级别
5. 日志持久化
5.1 配置日志文件保存目录
5.2 分割日志文件
5.3 设置日志的名称
6. 更简单的日志输出 - Lombok
6.1 基本注解
6.2 组合注解
6.3 日志注解
7. 总结
1. 日志的作用
对于我们来说,日志最重要的用途就是排除和定位问题。
除了以上的用途外,我们还可以通过日志实现以下功能:
- 记录用户登录日志,方便分析用户是正常登录还是恶意破解用户。
- 记录系统的操作日志,方便数据恢复和定位操作人员。
- 记录程序的执行时间,方便为以后优化程序提供数据支持。
2. 如何使用日志
Spring Boot 项目在启动时就默认输出日志:
以上就是 Spring Boot 输出的控制台信息。我们可以发现:
- Spring Boot 内置了日志框架
- 默认情况。输出的日志并是我们自己定义和打印的,那么我们如何自定义打印日志呢?
- 日志默认打印在控制台上,但是控制台的日志是不能被保存的,那么如何永久保存日志呢?
3. 自定义日志打印
自定义打印日志的步骤:
- 获取日志对象
- 设置打印的内容
3.1 获取日志对象
private Logger logger = LoggerFactory.getLogger(LogController.class);
此时,我们就获得了日志对象 logger。
3.2 设置打印的内容
接下来,在获取到日志对象后通过调用 info 方法,我们打印信息:
@Controller
public class LogController {
private Logger logger = LoggerFactory.getLogger(LogController.class);
@PostConstruct
public void postConstruct(){
logger.info("这是第一条日志信息...");
}
@RequestMapping("/log")
public String log(){
return "log...";
}
}
可以看到日志中打印了我们设置的内容:
当我们修改创建日志对象使用的名称时:
private Logger logger = LoggerFactory.getLogger("aaa");
可以看到打印的日志同样改变了:
3.3 常见的日志框架
3.4 日志格式说明
4. 日志级别
日志不宜过多或过少,过多会影响系统的性能;过少不利于排查问题。
4.1 日志级别的作用
- 日志级别可以筛选出重要的信息,比如设置日志级别为 error,那么就可以只看程序的报错日志,对于普通的调试日志和业务日志就可以忽略了,从而节省开发者信息筛选的时间。
- 日志级别可以控制不同环境下,⼀个程序是否需要打印日志,如开发环境我们需要很详细的信息, 而生产环境为了保证性能和安全性就会输出尽量少的日志,因此通过日志的级别就可以实现此需求。
4.2 日志级别的分类
- trace:微量,少许的意思,级别最低;
- debug:需要调试时候的关键信息打印;
- info:普通的打印信息(默认日志级别);
- warn:警告,不影响使用,但需要注意的问题;
- error:错误信息,级别较高的错误日志信息(需要解决);
- fatal:致命的,因为代码异常导致程序退出执行的事件。
日志级别的顺序:
4.3 日志级别的使用
@Controller
public class LogController {
private Logger logger = LoggerFactory.getLogger("aaa");
@PostConstruct
public void postConstruct(){
logger.trace("trace...");
logger.debug("debug...");
logger.info("info...");
logger.warn("warn...");
logger.error("error...");
}
@RequestMapping("/log")
public String log(){
return "log...";
}
}
打印如下图所示:
可以看到只打印了部分信息:info、warn、error。
可以看到并没有提供 fatal 级别的,因为一旦出现这种级别就需要立刻去解决问题了。
Spring Boot 项目默认的日志级别是 info,低于 info 级别的不打印;高于 info 级别的打印。
4.4 设置日志级别
在主配置文件 application.yml 中设置日志级别为 error:
logging:
level:
root: error
可以看到此时只打印了 error 级别的日志:
在主配置文件 application.yml 中设置日志级别为 warn,可以看到此时只打印了 warn 和 error 级别的日志:
在主配置文件 application.yml 中设置日志级别为 info,可以看到此时打印了info、warn 和 error 级别的日志:
可以看到,级别越高接收到的消息就越少。
4.5 分目录设置日志级别
系统日志:打印 warn 级别
业务日志:打印 debug 级别
logging:
level:
root: warn
com:
example:
demo: debug
5. 日志持久化
在生产环境上需要将日志保存下来,以便出现问题之后追溯问题,把日志保存下来的过程就叫做持久化。
5.1 配置日志文件保存目录
只需要在配置文件中指定日志的存储目录或者是指定日志保存文件名之后, Spring Boot 就会将控制台的日志写到相应的目录或文件下了。
接下来,我们将日志保存在指定的目录下:
logging:
file:
path: D:\temp\
那么如何测试这些日志能够持久化的保存呢?
接下来,我们再次运行程序,可以看到刚才的文本文件显示如下:
也就是说新的日志会追加到之前的日志之后,并不会代替之前的日志,从而实现了永久化存储日志。
5.2 分割日志文件
这种追加形式,可能会带来一个新的问题:日志文件会越来越大。对此,Spring 已经规定了文件的大小当超过 10 MB 时会进行分割:
同样我们也可以自行设置分割的标准,日志文件超过 1KB 就进行分割:
spring:
file:
path: D:\temp\
logback:
rollingpolicy:
max-file-size: 1KB
还可以设置分割后的日志文件名称:
spring:
file:
path: D:\temp\
logback:
rollingpolicy:
max-file-size: 1KB
file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i
5.3 设置日志的名称
logging:
file:
name: springboot.log
运行后可以看到新的日志文件直接在当前工程下生成了(默认):
也可以设置路径:
logging:
file:
name: D:\temp\springboot.log
6. 更简单的日志输出 - Lombok
输出日志的步骤依然是:
- 获取日志对象
- 打印日志
那么更简单的输出就是通过注解来完成,@Slf4j 注解 和 log 对象:
@Slf4j
@Controller
public class LogController2 {
@PostConstruct
public void postConstruct(){
log.trace("trace...");
log.debug("debug...");
log.info("info...");
log.warn("warn...");
log.error("error...");
}
}
运行后可以看到两种方式最终实现的效果是相同的:
通过查看 class 文件,可以看到 class 文件中没有 @Slfj 注解,而是多出了一行 log 对象的定义。
Java 程序的运行原理如下:
Lombok 的作用如下图所示:
6.1 基本注解
接下来,我们来看 Lombok 的一些注解:
注解 | 作用 |
---|---|
@Getter | 自动添加 getter 方法 |
@Setter | 自动添加 setter 方法 |
@ToString | 自动添加 tostring 方法 |
@EqualsAndHashCode | 自动添加equals 和 hashCode 方法 |
@NoArgsConstructor | 自动添加无参构造方法 |
@AllArgsConstructor | 自动添加全属性构造方法,顺序按照属性的定义顺序 |
@NonNull | 属性不能为 null |
@RequiredArgsConstructor | 自动添加必须属性构造方法,final + @NonNull 的属性为必需 |
public class Student {
private Integer id;
@Setter
private String name;
private Integer age;
}
public class Student {
private Integer id;
@Setter @Getter
private String name;
private Integer age;
}
@Setter @Getter
public class Student {
private Integer id;
private String name;
private Integer age;
}
类注解/属性注解:类注解:所有的属性都具备了对应注解的方法。
如果类加上了 @Setter,所有的属性都有了 set 方法;
如果类加上了 @Getter,所有的属性都有了 get 方法。
这两个注解可以单独使用。
如果该注解加在了属性上,对应的属性就有了 get/set 方法。
6.2 组合注解
注解 | 作用 |
---|---|
@Data | @Getter + @Setter + @ToString + @EqualsAndHashCode + @NoArgsConstructor + @RequiredArgsConstructor |
6.3 日志注解
注解 | 作用 |
---|---|
@Slf4j | 添加一个名为 log 的日志,使用 slf4j |
7. 总结
日志是程序中的重要组成部分,使用日志可以快速的发现和定位问题,Spring Boot 内容了日志框架, 默认情况下使用的是 info 日志级别将日志输出到控制台的,我们可以通过 lombok 提供的 @Slf4j 注解 和 log 对象快速的打印自定义日志,日志包含 6 个级别:
- trace:微量,少许的意思,级别最低;
- debug:需要调试时候的关键信息打印;
- info:普通的打印信息;
- warn:警告,不影响使用,但需要注意的问题;
- error:错误信息,级别较高的错误日志信息;
- fatal:致命的,因为代码异常导致程序退出执行的事件。
日志级别依次提升,而日志界别越高,收到的日志信息也就越少,我们可以通过配置日志的保存名称或保存目录来将日志永久地保存下来。