基于spring boot的日志框架最佳实践
1. 日志框架介绍
日志框架由两个部分组成,一个是日志门面,即日志接口,一个是日志实现。日志门面有JCL、jboss-logging、SLF4j等日志门面接口,而日志实现又有Log4j、JUL、Log4j2、Logback。
Spring boot默认引入了日志门面和日志实现,所以在maven的pom.xml文件中不需要额外添加日志相关的组件,其默认使用组合为:SLF4j+Logback
目前日志门面基本只用SLF4j,日志实现有较多的选择性,相比Logback,Log4j2性能更高,更强大,如果作者想更换为更强大的日志实现,替换默认的日志框架(Logback)为 Log4j2。这是通过 Maven 的依赖管理功能来实现的,在pom.xml文件中添加如下代码:
<!-- 排除默认日志实现 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
2. 日志添加
在Spring boot中添加日志非常简单,只需要在类上添加注解,并在想要打印日志的地方添加日志即可。
@SpringBootTest
@Slf4j
class Springboot01HelloApplicationTests {
@Test
void contextLoads() {
log.trace("trace日志测试");
log.debug("debug日志测试");
log.info("info日志测试");
log.warn("warn日志测试");
log.error("error日志测试");
}
}
日志内容的格式是:
格式: 时间 级别 进程id --- 项目名 --- 线程名 --- 当前类名: 日志内容
3. 日志打印级别
上诉一共有5种日志打印,其级别从低到高,打印内容从多到少。
级别:由低到高:ALL -- TRACE -- DEBUG -- INFO -- WARN -- ERROR -- OFF
越打印,越粗糙; 日志有一个默认级别(INFO);只会打印这个级别之上的所有信息;
# 日志配置
logging:
level:
root: info # 如果哪个包、哪个类不说日志级别,就用默认root的级别,默认info
com: # 指定用户业务代码包日志级别
wulang:
pnt: trace
同时也可以对业务包进行分组设置,更加精细化和灵活控制各个业务包的日志级别打印:
# 设置日志组
#logging.group.biz=com.atguigu.service,com.atguigu.dao
# 整组批量设置日志级别
#logging.level.biz=debug
5. 日志文件输出
Spring boot默认只把日志写在控制台,如果想额外记录到文件,可以在配置文件中添加logging.file.name或logging.file.path配置项
logging.file.name | lgging.file.path | 示例 | 效果 |
未指定 | 未指定 | 仅控制台输出 | |
指定 | 未指定 | my.log | 写入指定文件,可以加路径 |
未指定 | 指定 | /var/log | 写入指定目录,文件名为:spring.log |
指定 | 指定 | 以logging.file.name为准 |
# 当前项目所在的根文件夹下生成一个 指定名字的 日志文件
logging.file.name=boot.log
6. 文件归档和切割
归档:每天的日志单独存到一个文档中
切割:每个文件指定大小,超过这个大小,切割成另一个文件
配置项 | 描述 |
logging.logback.rollingpolicy.file-name-pattern | 日志存档的文件名格式: 默认值:${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz |
logging.logback.rollingpolicy.clean-history-on-start | 应用启动时是否清除以前存档: 默认值:false |
logging.logback.rollingpolicy.max-file-size | 每个日志文件的最大存储值: 默认10MB |
logging.logback.rollingpolicy.total-size-cap | 日志文件被删除之前,可以容纳的最大值。 默认0B,不设置大小,无限存储。 设置1GB则磁盘存储日志总量超过1GB就会删除旧日志文件 |
logging.logback.rollingpolicy.max-history | 日志文件保存的最大天数; 默认值:7 |
# 最大文件大小切割,单位M 默认 10M
logging.logback.rollingpolicy.max-file-size=10MB
# 日志删除
logging.logback.rollingpolicy.total-size-cap=1GB
logging.logback.rollingpolicy.max-history=7
7. 总结
一般情况下,日志配置文件都是默认的,只要配置了一份,其他项目拿来复用即可,不需要进行特意的设置,相对模版化,作者给出一份完整的配置,作为最佳实践以供使用。
# 日志配置
logging:
level:
root: info # 如果哪个包、哪个类不说日志级别,就用默认root的级别,默认info
com: # 指定用户业务代码包日志级别
wulang:
pnt: debug
file: #当前项目所在的根文件夹下生成一个 指定名字的 日志文件
name: boot.log
logback:
rolling policy:
clean-history-on-start: false # 应用启动时是否清除以前存档
max-file-size: 10MB # 每个日志文件的最大存储值
total-size-cap: 10GB # 日志累计最大存储值
max-history: 365 # 日志文件保存的最大天数