无法在日志中使用 Spring 属性占位符.xml溶液:

2022-09-01 01:13:26

我有一个使用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 文件(位于 jar 内部),并将 Logback 指向该文件 () 可以使一切按预期工作!<property resource="application-internal.properties" />


答案 1

从Spring Boot 1.3开始,您有更好的方法将弹簧属性放入日志回弹簧中.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

编辑:感谢安德斯

.........


答案 2

${...}不是春天的“春天EL”;它们是属性占位符。

我认为您将日志返回“变量”与春季“属性占位符”混淆了。

他们只是碰巧使用相同的语法 。${...}

logback 对 Spring 属性占位符机制一无所知,反之亦然。您需要根据 logback 文档而不是在 / 中配置 logback 变量,这完全是 Spring(引导)概念。application.propertiesapplication.yml

编辑:

快速查看日志备份文档后,添加

<property resource="application.properties" />

应该工作。logback.xml


推荐