日志记录原则
- 隔离性:日志输出不能影响系统正常运行;
- 安全性:日志打印本身不能存在逻辑异常或,导致产生安全问题;
- 数据安全:不允许输出机密、敏感信息,如用户联系方式、身份证号码、token等;
- 可监控分析:日志可以提供给监控进行监控,分析系统进行分析;
- 可定位排查:日志信息输出需有意义,需具有可读性,可供日常开发同学排查线上问题。
日志等级设置规范
在我们日常开发中有四种比较常见的日志打印等级,不同的等级适合在不同的时机下打印日志。
主要使用的有以下四个等级:
- DEBUG
DEUBG级别的主要输出调试性质的内容,该级别日志主要用于在开发、测试阶段输出。该级别的日志应尽可能地详尽,开发人员可以将各类详细信息记录到DEBUG里,起到调试的作用,包括参数信息,调试细节信息,返回值信息等等,便于在开发、测试阶段出现问题或者异常时,对其进行分析。 - INFO
INFO级别的主要记录系统关键信息,旨在保留系统正常工作期间关键运行指标,开发人员可以将初始化系统配置、业务状态变化信息,或者用户业务流程中的核心处理记录到INFO日志中,方便日常运维工作以及错误回溯时上下文场景复现。建议在项目完成后,在测试环境将日志级别调成INFO,然后通过INFO级别的信息看看是否能了解这个应用的运用情况,如果出现问题后是否这些日志能否提供有用的排查问题的信息。 - WARN
WARN级别的主要输出警告性质的内容,这些内容是可以预知且是有规划的,比如,某个方法入参为空或者该参数的值不满足运行该方法的条件时。在WARN级别的时应输出较为详尽的信息,以便于事后对日志进行分析。 - ERROR
ERROR级别主要针对于一些不可预知的信息,诸如:错误、异常等,比如,在catch块中抓获的网络通信、数据库连接等异常,若异常对系统的整个流程影响不大,可以使用WARN级别日志输出。在输出ERROR级别的日志时,尽量多地输出方法入参数、方法执行过程中产生的对象等数据,在带有错误、异常对象的数据时,需要将该对象一并输出。
实践
- 环境依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.wfx</groupId>
<artifactId>boot3-logging</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>boot3-logging</name>
<description>boot3-logging</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
- 配置application.yml
为了可以看出日志切片,这里设置为文件大小超过1KB就要生成新的文件,新的文件生成规则为logs文件加下,项目的名+日期+第几个+.log后缀
spring:
application:
name: boot3
logging:
file:
name: ./logs/boot3.log
logback:
rollingpolicy:
max-file-size: 1KB
file-name-pattern: ./logs/${spring.application.name}.%d{yyyy-MM-dd}.%i.log
- 启动测试
当项目启动,在该项目下就会生成logs/boot3.log文件
这是boot3.log中的内容 - 测试接口,生成多条文件日志
@Slf4j
@RestController
public class HelloController {
@RequestMapping("hello")
public String hello() {
for (int i = 0; i < 10; i++) {
log.info("===info===");
log.error("===error===");
log.warn("===warn===");
}
return "hello";
}
}
发送该接口后,发现目录下多了一个文件
现在boot3.log的内容为
boot3.2024-01-29.0.log的内容为
由此看出,最新的日志先存在boot3.log中,当超过设置的大小后,生成新的文件,并把以前的内容放到新的文件中,boot3.log只存储最新的日志