我有一个使用 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 不知道在哪里可以找到它。通过保持我的春节,相关性在我的外部application.properties文件,移动测井相关性为application-internal.properties文件(位于里面的罐子),并指向的logback到该文件(<property resource="application-internal.properties" />
)得到的一切工作正常!
从 Spring Boot 1.3 开始,您可以更好地将 spring 属性放入 logback-spring.xml 配置中:
现在您可以添加一个“springProperty”元素。
<springProperty name="destination" source="my.loggger.extradest"/> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>${destination}</file> ... </file> </appender>
https://github.com/spring-projects/spring-boot/commit/055ace37f006120b0006956b03c7f358d5f3729f
编辑:感谢安德斯
…………