我有一个使用 Logback 的 Spring Boot 控制台应用程序。所有属性(对于应用程序以及 Logback)都被外部化到类路径中的标准 application.properties 文件中。这些属性可以在应用程序本身中很好地获取,但不会在 logback.xml 文件中获取。看来 logback.xml 是在 Spring Boot 启动之前处理的,因此 EL 占位符不会被处理。
以 FileNamePattern 为例,在 application.properties 中,我有这样的内容:
log.filePattern=/%d{yyyy/MM-MMMM/dd-EEEE}
在 logback.xml 中,我将有以下内容:
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${log.logDirectory}${log.filePattern}.log
</FileNamePattern>
</rollingPolicy>
运行应用程序时,我会看到如下错误:
ERROR in ch.qos.logback.core.joran.spi.Interpreter@24:25 -
RuntimeException in Action for tag [rollingPolicy]
java.lang.IllegalStateException: FileNamePattern
[log.logDirectory_IS_UNDEFINEDlog.filePattern_IS_UNDEFINED.log]
does not contain a valid DateToken
类似的代码在其他 Spring(不是 Spring Boot)应用程序中工作得很好,所以我很好奇 Spring Boot 的行为是否有点不同。
解决方案:
感谢@Gary 的回复!很高兴了解 Spring EL 和 Logback 变量之间的区别...我以为是 Spring 负责为我解析这些变量。我did有这个元素,但这让我开始思考。
我的 application.properties 文件位于 jar 之外,因此 Logback 不知道在哪里可以找到它。通过将与 Spring 相关的属性保留在外部 application.properties 文件中,将与日志记录相关的属性移动到 application-internal.properties 文件中(位于insidejar),并将 Logback 指向that file (<property resource="application-internal.properties" />
)一切都按预期工作!