目录
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. 总结
对于我们来说,日志最重要的用途就是排除和定位问题。
除了以上的用途外,我们还可以通过日志实现以下功能:
Spring Boot 项目在启动时就默认输出日志:
以上就是 Spring Boot 输出的控制台信息。我们可以发现:
自定义打印日志的步骤:
private Logger logger = LoggerFactory.getLogger(LogController.class);
此时,我们就获得了日志对象 logger。
接下来,在获取到日志对象后通过调用 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");
可以看到打印的日志同样改变了:
日志不宜过多或过少,过多会影响系统的性能;过少不利于排查问题。
日志级别的顺序:
@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 级别的打印。
在主配置文件 application.yml 中设置日志级别为 error:
logging:
level:
root: error
可以看到此时只打印了 error 级别的日志:
在主配置文件 application.yml 中设置日志级别为 warn,可以看到此时只打印了 warn 和 error 级别的日志:
在主配置文件 application.yml 中设置日志级别为 info,可以看到此时打印了info、warn 和 error 级别的日志:
可以看到,级别越高接收到的消息就越少。
系统日志:打印 warn 级别
业务日志:打印 debug 级别
logging:
level:
root: warn
com:
example:
demo: debug
在生产环境上需要将日志保存下来,以便出现问题之后追溯问题,把日志保存下来的过程就叫做持久化。
只需要在配置文件中指定日志的存储目录或者是指定日志保存文件名之后, Spring Boot 就会将控制台的日志写到相应的目录或文件下了。
接下来,我们将日志保存在指定的目录下:
logging:
file:
path: D:\temp\
那么如何测试这些日志能够持久化的保存呢?
接下来,我们再次运行程序,可以看到刚才的文本文件显示如下:
也就是说新的日志会追加到之前的日志之后,并不会代替之前的日志,从而实现了永久化存储日志。
这种追加形式,可能会带来一个新的问题:日志文件会越来越大。对此,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
logging:
file:
name: springboot.log
运行后可以看到新的日志文件直接在当前工程下生成了(默认):
也可以设置路径:
logging:
file:
name: D:\temp\springboot.log
输出日志的步骤依然是:
那么更简单的输出就是通过注解来完成,@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 的作用如下图所示:
接下来,我们来看 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 方法。
注解 | 作用 |
---|---|
@Data | @Getter + @Setter + @ToString + @EqualsAndHashCode + @NoArgsConstructor + @RequiredArgsConstructor |
注解 | 作用 |
---|---|
@Slf4j | 添加一个名为 log 的日志,使用 slf4j |
日志是程序中的重要组成部分,使用日志可以快速的发现和定位问题,Spring Boot 内容了日志框架, 默认情况下使用的是 info 日志级别将日志输出到控制台的,我们可以通过 lombok 提供的 @Slf4j 注解 和 log 对象快速的打印自定义日志,日志包含 6 个级别:
日志级别依次提升,而日志界别越高,收到的日志信息也就越少,我们可以通过配置日志的保存名称或保存目录来将日志永久地保存下来。