我有一个使用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" />)得到的一切工作正常!
<property resource="application-internal.properties" />
${...}在spring不是“ Spring EL”;他们是财产占位符。
${...}
我认为你正在将logback“变量”与Spring“属性占位符”混淆。
它们恰好使用相同的语法${...}。
logback对Spring属性占位符机制一无所知,反之亦然。你需要根据logback文档配置logback变量,而不是application.properties/ application.yml,它严格来说是Spring(boot)概念。
application.properties/ application.yml
编辑:
快速查看了Logback文档后,添加
<property resource="application.properties" />
到logback.xml应该工作。
logback.xm
从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>