你能解释一下这个 Spring 环境变量解析吗?

Can you explain this Spring environment variable resolution?

Spring Boot docs 具有以下样本日志文件:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/>
    <include resource="org/springframework/boot/logging/logback/file-appender.xml" />
    <root level="INFO">
        <appender-ref ref="FILE" />
    </root>
</configuration>

你能帮我理解${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}这行吗? - 有什么用?

与 Bash 一样,Logback 使用 :- 作为其默认值运算符。有问题的行正在设置 LOG_FILE 属性:

  • 如果 LOG_FILE 已经设置,使用
  • 否则,如果设置了LOG_PATH,则使用后缀为spring.log
  • 否则,如果设置了LOG_TEMP,则使用后缀为/spring.log
  • 否则,如果设置了java.io.tmpdir,则使用后缀为/spring.log
  • 否则使用/tmp/spring.log

与Spring无关。

Logback XML 配置本身有这种占位符处理,可以用变量替换占位符。 logback 中占位符的语法是 ${VARNAME},如果 VARNAME 不存在,如果你想要默认值,你可以通过 ${VARNAME:-DEFAULT} 来实现(参考:Logback Configuration)。是的, a:-,后面跟默认值

那你引用的就很容易理解了:

${LOG_FILE:-                                                             }
            ${LOG_PATH:-                                      }spring.log
                        ${LOG_TEMP:-                        }/
                                     ${java.io.tmpdir:-    }
                                                       /tmp

(你真的需要解释上面的意思吗?)