Spring-Boot

阅读须知

全局懒加载

更换Banner

SpringBoot监听启动

获取启动参数

run方法前执行

关闭容器,退出程序

注入外部参数

  1. @Value注入配置文件参数

  2. 注入命令行参数

  3. 注入随机值

  4. 配置参数引用另一个配置参数

  5. 将配置文件映射到bean

    1. 基于set方法映射

    2. 基于构造器映射

    3. 注入List

    4. 注入Map

    5. 注入复杂属性List包含Pojo

    6. 注入复杂属性Map包含Pojo

  6. 将配置文件映射到@Bean标签

  7. 自动加载config目录下的application.properties文件

  8. 加载任意目录下,任意文件名的properties文件

  9. 设置指定环境的配置文件

  10. 根据不同的环境加载不同的Bean

日志记录

  1. 日志位置(推荐logging.file.name)

    1. logging.file.name

    2. logging.file.path

  2. 日志级别

  3. 日志分组

  4. 整合其他日志框架

  5. SpringBoot自带LogBack日志记录的其他设置

阅读须知

本博客使用参考SpringBoot文档。https://docs.spring.io/spring-boot/docs/2.2.4.RELEASE/reference/html/spring-boot-features.html

博客中包含代码片段使用SpringBoot2.2.4.RELEASE、JDK8。SpringBoot简化Spring开发,主要体现到减少XML配置,使用注解开发。SpirngBoot核心配置文件有application.properties和application.yml。两种方式,本博客使用properties文件(个人习惯问题)

全局懒加载

在Spring中@Lazy的注解和xml配置中<bean lazy=''>属性可以指定bean是否是延迟加载。看下面的代码片段。Controller中注入Service接口,但是该接口有两个实现类,Spring根据先byType后byName的原则,找到了类型可用的两个实现类,但是没有一个名称相同,这样会有问题的。SpringBoot启动失败。

package com.datang.springbootcode.alllazy;/*
* @auther 顶风少年 
* @mail dfsn19970313@foxmail.com
* @date 2020-02-04 14:27
* @notify 
* @version 1.0
*/
public interface UserService {
}
View Code
package com.datang.springbootcode.alllazy;/*
* @auther 顶风少年 
* @mail dfsn19970313@foxmail.com
* @date 2020-02-04 14:27
* @notify 
* @version 1.0
*/

import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl1 implements UserService {
}
View Code
package com.datang.springbootcode.alllazy;/*
* @auther 顶风少年 
* @mail dfsn19970313@foxmail.com
* @date 2020-02-04 14:27
* @notify 
* @version 1.0
*/

import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl2 implements UserService {
}
View Code
package com.datang.springbootcode.alllazy;/*
 * @auther 顶风少年
 * @mail dfsn19970313@foxmail.com
 * @date 2020-02-04 14:29
 * @notify
 * @version 1.0
 */

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping(value = "user")
    public String get() {
        return "ok";
    }
}
View Code

在配置文件中声明全局懒加载,则启动时不会报错,只有在发起请求时,才会报错。

spring.main.lazy-initialization=true
View Code

更换Banner

在resource目录下添加banner.txt和banner.png可以在启动时,更改默认的banner。通过配置文件指定banner的图片,会将图片转成ASCII码。这应该是是一个有趣味的功能了。

spring.banner.image.location=banner.png
View Code

SpringBoot监听启动

在SpringBoot启动前,我们可以设置监听类,在不同的地方监听SpringBoot。任何实现了ApplicationListener接口的类都可以作为监听类,如果指定了泛型类型,则在指定的位置监听。以下代码片段则是监听Spring上下文刷新。除此之外,还支持另外的8个监听点。注意如果不使用泛型,则会在每一个监听点都监听。另外在SpringBoot启动的main方法内还要添加监听器的对象。

package com.datang.springbootcode.applicationlistener;/*
* @auther 顶风少年 
* @mail dfsn19970313@foxmail.com
* @date 2020-02-02 17:41
* @notify 
* @version 1.0
*/

import org.springframework.boot.context.event.ApplicationStartingEvent;
import org.springframework.context.ApplicationListener;

//SpringBoot启动监听器
public class MyListener implements ApplicationListener<ApplicationStartingEvent> {

  /*  An ApplicationStartingEvent is sent at the start of a run but before any processing, except for the registration of listeners and initializers.

    An ApplicationEnvironmentPreparedEvent is sent when the Environment to be used in the context is known but before the context is created.

    An ApplicationContextInitializedEvent is sent when the ApplicationContext is prepared and ApplicationContextInitializers have been called but before any bean definitions are loaded.

    An ApplicationPreparedEvent is sent just before the refresh is started but after bean definitions have been loaded.

    An ApplicationStartedEvent is sent after the context has been refreshed but before any application and command-line runners have been called.

    An ApplicationReadyEvent is sent after any application and command-line runners have been called. It indicates that the application is ready to service requests.

    An ApplicationFailedEvent is sent if there is an exception on startup.

    The above list only includes SpringApplicationEvents that are tied to a SpringApplication. In addition to these, the following events are also published after ApplicationPreparedEvent and before ApplicationStartedEvent:

    A ContextRefreshedEvent is sent when an ApplicationContext is refreshed.

    A WebServerInitializedEvent is sent after the WebServer is ready. ServletWebServerInitializedEvent and ReactiveWebServerInitializedEvent are the servlet and reactive variants respectively.*/

    @Override
    public void onApplicationEvent(ApplicationStartingEvent applicationStartingEvent) {
        System.out.println("在上下文刷新之后,但在调用任何应用程序和命令行运行程序之前发送");
    }
}
View Code
package com.datang.springbootcode;

import com.datang.springbootcode.applicationlistener.MyListener;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringbootcodeApplication {

    public static void main(String[] args) {
        //SpringApplication.run(SpringbootcodeApplication.class, args);
        //注册SpringBoot启动监听器
        SpringApplication springApplication = new SpringApplication(SpringbootcodeApplication.class);
        springApplication.addListeners(new MyListener());
        springApplication.run(args);
    }

}
View Code

获取启动参数

ApplicationArguments该bean可以获取系统启动参数。为了测试,我们需要在命令行启动。

package com.datang.springbootcode.arguments;/*
* @auther 顶风少年 
* @mail dfsn19970313@foxmail.com
* @date 2020-02-02 20:23
* @notify 
* @version 1.0
*/

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Set;

@Component
public class ArgumentBean {
    @Autowired
    public ArgumentBean(ApplicationArguments args) {
        List<String> files = args.getNonOptionArgs();
        for (String s:files){
            System.out.println(s);
        }
        Set<String> optionNames = args.getOptionNames();
        for (String s:optionNames){
            System.out.println(s);
        }
        String[] sourceArgs = args.getSourceArgs();
        for (String s:sourceArgs){
            System.out.println(s);
        }
    }
}
View Code

run方法前执行

SpringBoot提供两个接口,ApplicationRunner和CommandLineRunner,实现任意一个接口的bean,都可以再run方法执行前执行。

package com.datang.springbootcode.runbefore;/*
* @auther 顶风少年 
* @mail dfsn19970313@foxmail.com
* @date 2020-02-03 13:07
* @notify 
* @version 1.0
*/

import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

/*
* 两个接口实现任意一个都行
* */
@Component
public class RunBeforeBean implements ApplicationRunner, CommandLineRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("ApplicationRunner run");
    }

    @Override
    public void run(String... args) throws Exception {
        System.out.println("CommandLineRunner run");
    }
}
View Code

关闭容器,退出程序

讲真这个关闭方法我不知道到底应用在什么场景下,执行该关闭方法,会返回一个状态码,但是这个方法内部会执行SpringContext的close()。也就是说,所有的SpringBean都会执行销毁方法。

package com.datang.springbootcode.exit;/*
 * @auther 顶风少年
 * @mail dfsn19970313@foxmail.com
 * @date 2020-02-03 13:30
 * @notify
 * @version 1.0
 */

import org.springframework.stereotype.Component;

import javax.annotation.PreDestroy;

@Component
public class ExitBean {
    @PreDestroy
    public void destroy() {
        System.out.println("ExitBean销毁");
    }
}
View Code
package com.datang.springbootcode.exit;/*
 * @auther 顶风少年
 * @mail dfsn19970313@foxmail.com
 * @date 2020-02-03 13:37
 * @notify
 * @version 1.0
 */

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ExitCodeGenerator;
import org.springframework.boot.SpringApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ExitController {

    @Autowired
    private ApplicationContext context;

    @GetMapping("exit")
    public String exit() {
        System.exit(SpringApplication.exit(context, new ExitCodeGenerator() {
            @Override
            public int getExitCode() {
                System.out.println("关闭容器");
                return 5000;
            }
        }));

        return "ok";
    }
}
View Code

注入外部参数

@Value注入配置文件参数

在application.properties中定义参数,这里我们通过run()方法的返回值拿到ConfigurableApplicationContext上下文对象,然后查看beanFactory->singletonObjects里边存储的bean信息。

package com.datang.springbootcode.autoargs;/*
 * @auther 顶风少年
 * @mail dfsn19970313@foxmail.com
 * @date 2020-02-04 18:39
 * @notify
 * @version 1.0
 */

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class AutoValue {
    @Value("${my.data1}")
    private String str;
}
View Code
my.data1=as properties
View Code

注入命令行参数

当配置文件中有my.data1参数我们在通过命令行注入到构造函数参数中。可以看出,命令行的注入的参数优先级比配置文件高。

package com.datang.springbootcode.autoargs;/*
 * @auther 顶风少年
 * @mail dfsn19970313@foxmail.com
 * @date 2020-02-03 14:16
 * @notify
 * @version 1.0
 */

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class CommandLine {
    public CommandLine(@Value("${my.data1}") String str) {
        System.out.println("我是命令行注入的" + str);
    }
}
View Code

注入随机值

package com.datang.springbootcode.autoargs;/*
 * @auther 顶风少年
 * @mail dfsn19970313@foxmail.com
 * @date 2020-02-03 14:09
 * @notify
 * @version 1.0
 */

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class RandomConfig {
    private String v1;
    private Integer v2;
    private Long v3;
    private String v4;
    private Integer v5;
    private Integer v6;

    public RandomConfig(@Value("${my.secret}") String v1, @Value("${my.number}") Integer v2,
                        @Value("${my.bignumber}") Long v3, @Value("${my.uuid}") String v4,
                        @Value("${my.number.less.than.ten}") Integer v5, @Value("${my.number.in.range}") Integer v6) {
        this.v1 = v1;
        this.v2 = v2;
        this.v3 = v3;
        this.v4 = v4;
        this.v5 = v5;
        this.v6 = v6;
    }
}
View Code
#提供随机值
my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[5,8]}
View Code

配置参数引用另一个配置参数

package com.datang.springbootcode.autoargs;/*
* @auther 顶风少年 
* @mail dfsn19970313@foxmail.com
* @date 2020-02-05 10:58
* @notify 
* @version 1.0
*/

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class ValueCiteValue {
    @Value("${my.data2}")
    private String name;
}
View Code
#配置参数
my.data1=as properties

#引用配置参数
my.data2=${my.data1}
View Code

将配置文件映射到bean

基于set方法映射

请注意基于set方法必须显式的声明set()方法。@ConfigurationProperties(value = "my.person")不需要添加${}

#单独的person对象
my.person.name=zhangsan
my.person.age=12
View Code
package com.datang.springbootcode.autoargs.autobean;/*
 * @auther 顶风少年
 * @mail dfsn19970313@foxmail.com
 * @date 2020-02-05 11:15
 * @notify
 * @version 1.0
 */

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@ConfigurationProperties(value = "my.person")
@Component
public class Person {

    private String name;
    private Integer age;

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}
View Code

基于构造器映射

请注意,基于构造器映射,不可以使用@Component自动注入系列的注解。首先@ConstructorBinding声明该bean通过构造器映射,然后需要在任意bean上添加@EnableConfigurationProperties(Student.class)。如果有多个构造器映射可以使用@ConfigurationPropertiesScan(value = {"com.datang.springbootcode.autoargs.autobean"})扫描包。建议在SpringBoot启动类上添加。

package com.datang.springbootcode.autoargs.autobean;/*
 * @auther 顶风少年
 * @mail dfsn19970313@foxmail.com
 * @date 2020-02-05 11:26
 * @notify
 * @version 1.0
 */

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.ConstructorBinding;

@ConfigurationProperties(value = "my.person")
@ConstructorBinding
public class Student {
    private String name;
    private Integer age;

    public Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}
View Code

注入List

在原有的Person对象中增加hobby属性,类型为List

package com.datang.springbootcode.autoargs.autobean;/*
 * @auther 顶风少年
 * @mail dfsn19970313@foxmail.com
 * @date 2020-02-05 11:15
 * @notify
 * @version 1.0
 */

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.List;

@ConfigurationProperties(value = "my.person")
@Component
public class Person {

    private String name;
    private Integer age;
    private List hobby;

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public void setHobby(List hobby) {
        this.hobby = hobby;
    }
}
View Code
#单独的person对象
my.person.name=zhangsan
my.person.age=12
my.person.hobby[0]=lanqiu
my.person.hobby[1]=zuqiu
View Code

注入Map

在原有的Person对象上添加Map集合

package com.datang.springbootcode.autoargs.autobean;/*
 * @auther 顶风少年
 * @mail dfsn19970313@foxmail.com
 * @date 2020-02-05 11:15
 * @notify
 * @version 1.0
 */

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

@ConfigurationProperties(value = "my.person")
@Component
public class Person {

    private String name;
    private Integer age;
    private List hobby;
    private Map honey;
    public void setName(String name) {
        this.name = name;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public void setHobby(List hobby) {
        this.hobby = hobby;
    }

    public void setHoney(Map honey) {
        this.honey = honey;
    }
}
View Code
#单独的person对象
my.person.name=zhangsan
my.person.age=12
my.person.hobby[0]=lanqiu
my.person.hobby[1]=zuqiu
my.person.honey.k1=xiaohong
my.person.honey.k2=xiaohong
View Code

注入复杂属性List包含Pojo

在bean中增加List集合,集合元素为Student

package com.datang.springbootcode.autoargs.autobean;/*
 * @auther 顶风少年
 * @mail dfsn19970313@foxmail.com
 * @date 2020-02-05 11:15
 * @notify
 * @version 1.0
 */

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

@ConfigurationProperties(value = "my.person")
@Component
public class Person {

    private String name;
    private Integer age;
    private List hobby;
    private Map honey;
    private List<Student> studentList;
    public void setName(String name) {
        this.name = name;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public void setHobby(List hobby) {
        this.hobby = hobby;
    }

    public void setHoney(Map honey) {
        this.honey = honey;
    }

    public void setStudentList(List<Student> studentList) {
        this.studentList = studentList;
    }
}
View Code
#单独的person对象
my.person.name=zhangsan
my.person.age=12
my.person.hobby[0]=lanqiu
my.person.hobby[1]=zuqiu
my.person.honey.k1=xiaohong
my.person.honey.k2=xiaohong
my.person.studentList[0].name=xuesheng1
my.person.studentList[0].age=11
my.person.studentList[1].name=xuesheng2
my.person.studentList[1].age=22
View Code

注入复杂属性Map包含Pojo

在bean中增加Map集合,value为Studeng类型

package com.datang.springbootcode.autoargs.autobean;/*
 * @auther 顶风少年
 * @mail dfsn19970313@foxmail.com
 * @date 2020-02-05 11:15
 * @notify
 * @version 1.0
 */

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

@ConfigurationProperties(value = "my.person")
@Component
public class Person {

    private String name;
    private Integer age;
    private List hobby;
    private Map honey;
    private List<Student> studentList;
    private Map<String,Student> studentMap;
    public void setName(String name) {
        this.name = name;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public void setHobby(List hobby) {
        this.hobby = hobby;
    }

    public void setHoney(Map honey) {
        this.honey = honey;
    }

    public void setStudentList(List<Student> studentList) {
        this.studentList = studentList;
    }

    public void setStudentMap(Map<String, Student> studentMap) {
        this.studentMap = studentMap;
    }
}
View Code
#单独的person对象
my.person.name=zhangsan
my.person.age=12
my.person.hobby[0]=lanqiu
my.person.hobby[1]=zuqiu
my.person.honey.k1=xiaohong
my.person.honey.k2=xiaohong
my.person.studentList[0].name=xuesheng1
my.person.studentList[0].age=11
my.person.studentList[1].name=xuesheng2
my.person.studentList[1].age=22
my.person.studentMap.no1.name=chenhehe
my.person.studentMap.no1.age=44
my.person.studentMap.no2.name=meijiajia
my.person.studentMap.no2.age=88
View Code

将配置文件映射到@Bean标签

您也可以将配置参数映射到@Bean标签返回的对象上。但是返回的这个pojo也需要遵循有set方法,后者构造器注入。

package com.datang.springbootcode.autoargs.autojavabean;/*
* @auther 顶风少年 
* @mail dfsn19970313@foxmail.com
* @date 2020-02-05 14:39
* @notify 
* @version 1.0
*/
public class Phone {
    private String size;
    private String color;

    public void setSize(String size) {
        this.size = size;
    }

    public void setColor(String color) {
        this.color = color;
    }
}
View Code
package com.datang.springbootcode.autoargs.autojavabean;/*
 * @auther 顶风少年
 * @mail dfsn19970313@foxmail.com
 * @date 2020-02-05 14:38
 * @notify
 * @version 1.0
 */

import com.datang.springbootcode.autoargs.autobean.Student;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AutoJavaBean {
    @Bean
    @ConfigurationProperties(value = "my.phone")
    public Phone phone() {
        return new Phone();
    }
}
View Code
#手机型号
my.phone.size=22x
my.phone.color=red
View Code

自动加载config目录下的application.properties文件

SpringBoot允许我们在classpath下的config目录下创建application.properties文件,并且会读取该文件。但是,只限于config下,名为application.properties

package com.datang.springbootcode.autoargs;/*
* @auther 顶风少年 
* @mail dfsn19970313@foxmail.com
* @date 2020-02-05 14:57
* @notify 
* @version 1.0
*/

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@ConfigurationProperties(value = "my2.plague")
@Component
public class AutherProper {
    private String name;
    private String size;

    public void setName(String name) {
        this.name = name;
    }

    public void setSize(String size) {
        this.size = size;
    }
}
View Code
my2.plague.name=guanzhuangbingdu
my2.plague.size=10000
View Code

加载任意目录下,任意文件名的properties文件

通过@PropertySource("classpath:haha.properites")注解,声明任意的文件被加入Environment对象中。

my3.plague.name=guanzhuangbingdu
my3.plague.size=10000
View Code
package com.datang.springbootcode.autoargs;/*
* @auther 顶风少年 
* @mail dfsn19970313@foxmail.com
* @date 2020-02-05 15:05
* @notify 
* @version 1.0
*/

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@Component
@PropertySource("classpath:haha.properties")
@ConfigurationProperties(value = "my3.plague")
public class CustomConfig {
    private String name;
    private String size;

    public void setName(String name) {
        this.name = name;
    }

    public void setSize(String size) {
        this.size = size;
    }
}
View Code

设置指定环境的配置文件

通过使用spring.profiles.active可以指定加载不同环境的配置文件。但是不同环境的文件名必须按照application-xxx.properties的格式。

#设置环境
spring.profiles.active=b
View Code
my.database.username=123
my.database.password=abc
View Code
my.database.username=321
my.database.password=cba
View Code

根据不同的环境加载不同的Bean

在一个bean上添加@Profile("a")可根据不同的环境选择是否注入该bean。当前的环境是b则只有Profile2被成功注入。

package com.datang.springbootcode.autoargs.activeconfig;/*
* @auther 顶风少年 
* @mail dfsn19970313@foxmail.com
* @date 2020-02-05 15:20
* @notify 
* @version 1.0
*/

import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;

@Profile("a")
@Component
public class Profile1 {
}
View Code
package com.datang.springbootcode.autoargs.activeconfig;/*
* @auther 顶风少年 
* @mail dfsn19970313@foxmail.com
* @date 2020-02-05 15:20
* @notify 
* @version 1.0
*/

import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;

@Profile("b")
@Component
public class Profile2 {
}
View Code

日志记录

日志位置

logging.file.name

基于项目路径

基于绝对路径

logging.file.path

基于项目路径

文件名它自己设置的spring.log。

基于绝对路径

也是自己搞了个spring.log

日志级别

可以设置全局日志级别,也可以分包设置日志级别。

#TRACE,DEBUG,INFO,WARN,ERROR,FATAL或OFF
#设置全局的日志级别
logging.level.root=trace
#设置包的日志级别
logging.level.com.datang.springbootcode=debug
View Code

日志分组

可以把几个包或者一个包分成一组,给这一组设置日志级别。

#设置日志组
logging.group.server=com.datang.springbootcode.alllazy,com.datang.springbootcode.exit
#设置日志组的日志级别
logging.level.server=error
View Code

整合其他日志框架

默认的SpringBoot使用的是Logback日志框架。如果想要使用其他的日志框架如Log4j或者Log4j2。只需要引入相关jar。在配置文件中引用日志配置即可。

logging.config=classpath:xxx.xml
View Code

SpringBoot自带LogBack日志记录的其他设置

文件大小

当前我的项目启动大概需要800+KB,这里我设置每一个文件最大300KB,他自动分成了三个。

 

打包文件名格式

归档文件最大天数

这个天数目前没有测试出来,我觉得(if我不要你觉得,我要我觉得else自己测试)需要服务器连续启动才可以。

#归档文件最大天数。
logging.file.max-history=1
View Code

关于日志配置经过测试的只有上边的部分,一下附带一个完整的配置 https://docs.spring.io/spring-boot/docs/2.2.4.RELEASE/reference/html/spring-boot-features.html#boot-features-custom-log-configuration

原文地址:https://www.cnblogs.com/zumengjie/p/12259442.html