SpringBoot自动配置原理之log文件创建源码分析

1.Springboot在启动的时候初始化日志监听器

org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener

2.日志监听器的初始化方法

protected void initialize(ConfigurableEnvironment environment, ClassLoader classLoader) {
        (new LoggingSystemProperties(environment)).apply();
        this.logFile = LogFile.get(environment);
        if (this.logFile != null) {
            this.logFile.applyToSystemProperties();
        }

        this.loggerGroups = new LoggerGroups(DEFAULT_GROUP_LOGGERS);
        this.initializeEarlyLoggingLevel(environment);
        this.initializeSystem(environment, this.loggingSystem, this.logFile);
        this.initializeFinalLoggingLevels(environment, this.loggingSystem);
        this.registerShutdownHookIfNecessary(environment, this.loggingSystem);
    }

this.logFile = LogFile.get(environment)这里获取日志文件路径

3.LogFile类

public class LogFile {
    public static final String FILE_NAME_PROPERTY = "logging.file.name";
    public static final String FILE_PATH_PROPERTY = "logging.file.path";
    private final String file;
    private final String path;

    LogFile(String file) {
        this(file, (String)null);
    }

    LogFile(String file, String path) {
        Assert.isTrue(StringUtils.hasLength(file) || StringUtils.hasLength(path), "File or Path must not be empty");
        this.file = file;
        this.path = path;
    }

    public void applyToSystemProperties() {
        this.applyTo(System.getProperties());
    }

    public void applyTo(Properties properties) {
        this.put(properties, "LOG_PATH", this.path);
        this.put(properties, "LOG_FILE", this.toString());
    }

    private void put(Properties properties, String key, String value) {
        if (StringUtils.hasLength(value)) {
            properties.put(key, value);
        }

    }

    public String toString() {
        return StringUtils.hasLength(this.file) ? this.file : (new File(this.path, "spring.log")).getPath();
    }

    public static LogFile get(PropertyResolver propertyResolver) {
        String file = propertyResolver.getProperty("logging.file.name");
        String path = propertyResolver.getProperty("logging.file.path");
        return !StringUtils.hasLength(file) && !StringUtils.hasLength(path) ? null : new LogFile(file, path);
    }
}

这里会自动从application.propertie或者application.yml中获取logfile的name和path

4.LogFile方法get(静态方法)

    public static LogFile get(PropertyResolver propertyResolver) {
        String file = propertyResolver.getProperty("logging.file.name");
        String path = propertyResolver.getProperty("logging.file.path");
        return !StringUtils.hasLength(file) && !StringUtils.hasLength(path) ? null : new LogFile(file, path);
    }
  1. get方法首先从springboot配置文件中获取filename和fileapath
  2. 然后判断是否获取成功,如果都没有获取成功,返回null
  3. 那么springboot就不会将日志写到文件
  4. 如果获取一个值或全部获取就返回 一个LogFile,通过构造函数传入filename和filepath

5.LogFile核心逻辑toString()

toString是Object的方法,java中所有类都是Object的子类,LogFile重写了toString方法

    public String toString() {
        return StringUtils.hasLength(this.file) ? this.file : (new File(this.path, "spring.log")).getPath();
    }

判断filename是否有值:

  1. 如果有值直接返回filename
  2. 否则返回路径+spring.log

6.结论

也就是说,如果我们配置了filename和filepath,那么我们的日志文件名就是filename,路径会忽略;
如果我们只配置了路径,那么我们的日志文件名默认是spring.log,并且springboot会自动帮我们创建文件夹

所以,如果我们想指定自己日志的路径和名称,那么我们的路径里文件夹必须自己创建

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值