如何理解 spring boot 配置中的 logging.file.name 和 logging.file.path

859 阅读1分钟

logging.file.name 和 logging.file.path 容易被误解为生成文件, 以及生成文件路径配置,最终生成路径为 logging.file.path + logging.file.name , 但是, 实际上只会选取其中一个配置生效, 下面几种常见情况

  • logging.file.name 和 logging.file.path 同时配置, 只会使用 logging.file.name, 如果没加路径一般会生成在当前工作目录下
  • logging.file.path: 生成路径为 logging.file.path + spring.log
  • logging.file.name: 使用完整路径配置, 生成完整路径

下面尝试分析下产生的原因, 代码使用 springboot 2.6.3 作为源码查看

核心要素类

  • LogFile 类

  • springboot.jar 包中的 base.xml 以及 file-appender.xml

loggin file 的核心逻辑, 位于 org.springframework.boot.logging.LogFile 中, 启动时断点可以设置在 applyToSystemProperties 方法上

	// spring boot 配置的属性名
	public static final String FILE_NAME_PROPERTY = "logging.file.name";

	public static final String FILE_PATH_PROPERTY = "logging.file.path";

	// 用于获取配置参数
	public static LogFile get(PropertyResolver propertyResolver) {
		String file = propertyResolver.getProperty(FILE_NAME_PROPERTY);
		String path = propertyResolver.getProperty(FILE_PATH_PROPERTY);
		if (StringUtils.hasLength(file) || StringUtils.hasLength(path)) {
			return new LogFile(file, path);
		}
		return null;
	}

        // 配置添加到系统属性中
	public void applyToSystemProperties() {
		applyTo(System.getProperties());
	}

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

base.xml 配置, 路径位于下图所示位置

image.png

<included>
   <include resource="org/springframework/boot/logging/logback/defaults.xml" />
   <!-- LOG_FILE, LOG_PATH 和 LogFile 配置的系统属性一致, 用于提取系统属性 -->
   <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
   <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
   <include resource="org/springframework/boot/logging/logback/file-appender.xml" />
   <root level="INFO">
      <appender-ref ref="CONSOLE" />
      <appender-ref ref="FILE" />
   </root>
</included>

下面是这个配置的解析:

  1. ${LOG_FILE:- - 如果 LOG_FILE 环境变量已经被设置,使用它的值。否则,执行下一步。
  2. ${LOG_PATH:- - 如果 LOG_PATH 环境变量已经被设置,使用它的值。否则,执行下一步。
  3. ${LOG_TEMP:- - 如果 LOG_TEMP 环境变量已经被设置,使用它的值。否则,执行下一步。
  4. ${java.io.tmpdir:-/tmp} - 如果 java.io.tmpdir 系统属性已经被设置,使用它的值。否则,使用 /tmp 作为默认值。

因此,表达式首先尝试使用 LOG_FILE 环境变量,然后尝试使用 LOG_PATHLOG_TEMP 环境变量,最后使用系统属性 java.io.tmpdir 或者默认值 /tmp。一旦确定了合适的路径,就会将 spring.log 文件名添加到路径末尾,得到最终的日志文件路径。