SpringBoot的日志系统(日志分组、文件输出、滚动归档)

@[toc](目录)

> SpringBoot3需要jdk17

1. 简介

  1. Spring5及以后Spring自己实现了commons-logging,来作为内部的日志。日志的jar包是org.springframework:spring-jcl:6.0.10。查看org.apache.commons.logging.LogAdapter

```Java

package org.apache.commons.logging;

......省略部分......

final class LogAdapter {

private static final boolean log4jSpiPresent = isPresent("org.apache.logging.log4j.spi.ExtendedLogger");

private static final boolean log4jSlf4jProviderPresent = isPresent("org.apache.logging.slf4j.SLF4JProvider");

private static final boolean slf4jSpiPresent = isPresent("org.slf4j.spi.LocationAwareLogger");

private static final boolean slf4jApiPresent = isPresent("org.slf4j.Logger");

private static final Function<String, Log> createLog;

......省略部分......

```

只要导入了哪些日志包,就会使用哪些日志实现框架。所以底层的日志是开放的,可对接其他日志框架

  1. 支持 jul、log4j2、logback(默认)日志实现。SpringBoot 提供了默认的控制台输出配置,也可以配置输出为文件

2. SpringBoot日志默认配置流程

1、每个starter场景,都会导入一个核心场景spring-boot-starter

2、核心场景引入了日志的所用功能spring-boot-starter-logging

3、spring-boot-starter-logging默认使用了logback + slf4j 组合作为默认底层日志

4、日志是系统一启动就要用,xxxAutoConfiguration是系统启动好了以后放好的组件,后来用的

5、查看autoconfiguration的logging目录,可以看到日志是利用监听器机制配置好的

6、日志所有的配置都可以通过修改配置文件实现。是以logging开始的所有配置

3. 默认日志格式

```

......省略部分......

2023-07-13T05:06:01.866+08:00 INFO 3096 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''

2023-07-13T05:06:01.881+08:00 INFO 3096 --- [ main] c.h.s.SpringBoot3TestApplication : Started SpringBoot3TestApplication in 3.383 seconds (process running for 4.406)

```

默认输出格式:

  • 时间和日期:毫秒级精度

  • 日志级别:ERROR、WARN、INFO、DEBUG

  • 进程ID

  • ---: 消息分割符

  • 线程名: 使用[]包含

  • Logger名: 通常是产生日志的类名

  • 消息:日志记录的内容

默认值:参照:org.springframework.boot:spring-boot:3.1.1的META-INF的additional-spring-configuration-metadata.json文件

```

{

"name": "logging.pattern.console",

"type": "java.lang.String",

"description": "Appender pattern for output to the console. Supported only with the default Logback setup.",

"sourceType": "org.springframework.boot.context.logging.LoggingApplicationListener",

"defaultValue": "%clr(%d{{LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}}){faint} %clr({LOG_LEVEL_PATTERN:-%5p}) %clr({PID:- }){magenta} %clr(---){faint} %clr(\[%15.15t\]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n{LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"

}

```

修改默认值如下:

```

显示示例: 2023-07-13 05:16:09.952 INFO [main] c.h.s.SpringBoot3TestApplication ===> Started SpringBoot3TestApplication in 2.305 seconds (process running for 3.107)

logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} ===> %msg%n

只修改控制台输出的日期格式

logging.pattern.dateformat=yyyy-MM-dd HH:mm:ss.SSS

```

4. 在类中记录日志

```Java

package com.hh.springboot3test.controller;

import lombok.extern.slf4j.Slf4j;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RestController;

@Slf4j

@RestController

public class ControllerTest {

// Logger log = LoggerFactory.getLogger(getClass());

@GetMapping("/hello")

public String hello() {

// 2023-07-13 05:24:15.659 INFO 10212 --- [nio-8080-exec-2] c.h.s.controller.ControllerTest : 进入hello方法了

log.info("进入hello方法了");

return "hello";

}

}

```

5. 日志级别

由低到高:ALL、TRACE、DEBUG、INFO、WARN、ERROR、FATAL、OFF

  • ALL:打印所有日志

  • TRACE:追踪框架详细流程日志,一般不使用

  • DEBUG:开发调试细节日志

  • INFO:关键、感兴趣信息日志

  • WARN:警告但不是错误的信息日志,比如:版本过时

  • ERROR:业务错误日志,比如出现各种异常

  • FATAL:致命错误日志,比如jvm系统崩溃

  • OFF:关闭所有日志记录

定义在org.springframework.boot:spring-boot:3.1.1的org.springframework.boot.logging.LogLevel枚举类

application.properties文件配置日志级别

```

默认日志级别设置

logging.level.root=info

设置一个包或类的日志级别

logging.level.com.hh.springboot3test.controller.ControllerTest=debug

```

6. 日志分组

将相关的logger分组在一起,统一配置。application.properties配置如下:

```

多个值用逗号分隔

logging.group.my-logging-group=com.hh.springboot3test.controller.ControllerTest

logging.level.my-logging-group=warn

```

SpringBoot预定义两个组

7. 文件输出

SpringBoot默认只把日志写在控制台,如果想额外记录到文件,可以在application.properties中添加logging.file.name或logging.file.path配置项

logging.file.name | logging.file.path | 示例 | 效果

------ | ------ | ------ | ------

未指定 | 未指定 | | 仅控制台输出

指定 | 未指定 | D:\\my.log | 写入指定文件。可以加路径,默认路径是项目根路径

未指定 | 指定 | D:\\ | 写入指定目录,文件名为spring.log

指定 | 指定 | | logging.file.path无效,以logging.file.name为准

8. 文件归档与滚动切割

> 生产环境可以配置按日志级别分类,进行文件归档和滚动切割

归档:每天的日志单独存到一个文档中

切割:每个文件10MB,超过大小切割成另外一个文件

  1. 每天的日志应该独立分割出来存档。如果使用logback(SpringBoot默认整合),可以通过application.properties/yaml文件指定日志滚动规则

  2. 如果是其他日志系统,需要自己在日志配置文件中进行配置(添加log4j2.xml或log4j2-spring.xml)

  3. 默认支持的滚动规则设置如下:

配置项 | 描述

------ | ------

logging.logback.rollingpolicy.file-name-pattern | 日志存档的文件名格式(默认值:${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz)。需要开启日志文件输出。`LOG_FILE`就是日志输出的路径和名称

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)

9. 自定义配置

日志系统 | 自定义

------ | ------

Logback| logback-spring.xml、logback-spring.groovy、logback.xml、logback.groovy

Log4j2 | log4j2-spring.xml、log4j2.xml

JDK (Java Util Logging) | logging.properties

建议在日志配置文件中使用-spring变量(例如使用logback-spring.xml而不是logback.xml)。如果您使用标准配置文件,日志初始化时的日志spring不能获取

比如可以使用logback-spring.xml文件进行配置。会和SpringBoot的logback配置混合起作用

10. 切换使用log4j2

直接在pom.xml添加依赖就可以了。但是不能使用文件归档与滚动切割,需要在log4j2.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>

```

也可以使用log4j2-spring.xml文件进行配置。会和SpringBoot的log4j2配置混合起作用

11 实践

  1. 导入任何第三方框架,先排除它的日志包,因为SpringBoot底层控制好了日志

  2. 修改application.properties配置文件,就可以调整日志的所有行为。如果不够,可以编写日志框架自己的配置文件放在资源路径下就行,比如logback-spring.xml,log4j2-spring.xml

  3. 如需对接专业日志系统,如把logback记录的日志灌倒kafka之类的中间件,这和SpringBoot没关系,都是日志框架自己的配置,修改配置文件即可

相关推荐
后端小张2 分钟前
【JAVA 进阶】穿越之我在修仙世界学习 @Async 注解(深度解析)
java·开发语言·spring boot·后端·spring·注解·原理
Harold29 分钟前
SpringBoot的jar包启动流程梳理
spring boot
JanelSirry30 分钟前
Java + Spring Boot + Redis技术栈,在实际使用缓存时遇到 缓存击穿、缓存穿透、缓存雪崩
java·spring boot·缓存
陈果然DeepVersion1 小时前
Java大厂面试真题:Spring Boot+Kafka+AI智能客服场景全流程解析(十二)
java·spring boot·ai·kafka·面试题·向量数据库·rag
陈果然DeepVersion2 小时前
Java大厂面试真题:Spring Boot+Kafka+AI智能客服场景全流程解析(九)
java·人工智能·spring boot·微服务·kafka·面试题·rag
爆爆凯2 小时前
Spring Boot Web上下文工具类详解:获取Request、Response和参数
前端·spring boot·后端
行思理2 小时前
Lombok 新手教程
java·spring boot·lombok
观望过往2 小时前
Spring Boot 集成 InfluxDB 2.x 完整技术指南
java·spring boot·influxdb
摇滚侠11 小时前
Spring Boot3零基础教程,Spring Boot 应用打包成 exe 可执行文件,笔记91 笔记92 笔记93
linux·spring boot·笔记
lang2015092813 小时前
Spring Boot日志配置完全指南
java·spring boot·单元测试