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 配置, 路径位于下图所示位置
<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>
下面是这个配置的解析:
${LOG_FILE:-- 如果LOG_FILE环境变量已经被设置,使用它的值。否则,执行下一步。${LOG_PATH:-- 如果LOG_PATH环境变量已经被设置,使用它的值。否则,执行下一步。${LOG_TEMP:-- 如果LOG_TEMP环境变量已经被设置,使用它的值。否则,执行下一步。${java.io.tmpdir:-/tmp}- 如果java.io.tmpdir系统属性已经被设置,使用它的值。否则,使用/tmp作为默认值。
因此,表达式首先尝试使用 LOG_FILE 环境变量,然后尝试使用 LOG_PATH 和 LOG_TEMP 环境变量,最后使用系统属性 java.io.tmpdir 或者默认值 /tmp。一旦确定了合适的路径,就会将 spring.log 文件名添加到路径末尾,得到最终的日志文件路径。