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 小时前
SpringBoot自动装配原理解析
java·spring boot·后端
计算机-秋大田2 小时前
基于微信小程序的养老院管理系统的设计与实现,LW+源码+讲解
java·spring boot·微信小程序·小程序·vue
魔道不误砍柴功4 小时前
简单叙述 Spring Boot 启动过程
java·数据库·spring boot
枫叶_v4 小时前
【SpringBoot】22 Txt、Csv文件的读取和写入
java·spring boot·后端
路在脚下@4 小时前
Springboot 的Servlet Web 应用、响应式 Web 应用(Reactive)以及非 Web 应用(None)的特点和适用场景
java·spring boot·servlet
尘浮生6 小时前
Java项目实战II基于微信小程序的移动学习平台的设计与实现(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·学习·微信小程序·小程序
2401_857610036 小时前
Spring Boot框架:电商系统的技术优势
java·spring boot·后端
java—大象8 小时前
基于java+springboot+layui的流浪动物交流信息平台设计实现
java·开发语言·spring boot·layui·课程设计
ApiHug8 小时前
ApiSmart x Qwen2.5-Coder 开源旗舰编程模型媲美 GPT-4o, ApiSmart 实测!
人工智能·spring boot·spring·ai编程·apihug
魔道不误砍柴功8 小时前
探秘Spring Boot中的@Conditional注解
数据库·spring boot·oracle