一尘不染

无法在logback.xml中使用Spring属性占位符

spring

我有一个使用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的行为是否有所不同。

解:

很高兴知道Spring EL和Logback变量之间的区别…我以为是Spring负责为我解析这些变量。我确实有元素,但是这让我开始思考。

我的application.properties文件在jar之外,因此Logback不知道在哪里找到它。通过保持我的春节,相关性在我的外部application.properties文件,移动测井相关性为application-internal.properties文件(位于里面的jar),并指向的logback到该文件(<property resource="application-internal.properties" />)得到的一切工作正常!


阅读 1598

收藏
2020-04-19

共2个答案

一尘不染

${...}在spring不是“ Spring EL”;他们是财产占位符。

我认为你正在将logback“变量”与Spring“属性占位符”混淆。

它们恰好使用相同的语法${...}

logback对Spring属性占位符机制一无所知,反之亦然。你需要根据logback文档配置logback变量,而不是application.properties/ application.yml,它严格来说是Spring(boot)概念。

编辑:

快速查看了Logback文档后,添加

<property resource="application.properties" />

logback.xml应该工作。

2020-04-19
一尘不染

从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>
2020-04-19