【发布时间】:2015-06-02 01:57:04
【问题描述】:
我有一个使用 Logback 的 Spring Boot 控制台应用程序。所有属性(对于应用程序以及 Logback)都被外部化到类路径中的标准 application.properties 文件中。这些属性在应用程序本身中可以很好地获取,但不会在 logback.xml 文件中获取。看起来好像在 Spring Boot 启动之前处理了 logback.xml,因此不处理 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 负责为我解析这些变量。我确实拥有该元素,但这让我开始思考。
我的 application.properties 文件在 jar 之外,所以 Logback 不知道在哪里可以找到它。通过将与 Spring 相关的属性保存在我的外部 application.properties 文件中,将与日志记录相关的属性移动到 application-internal.properties 文件(位于 inside jar 中),并将 Logback 指向 该文件 (<property resource="application-internal.properties" />) 让一切都按预期工作!
【问题讨论】:
标签: java spring spring-boot logback