无法在logback.xml中使用Spring Property Place
我有一个使用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中,我会这样:
${log.logDirectory}${log.filePattern}.log
运行应用程序时,我会看到以下错误:
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文件中保存与Spring相关的属性,将与日志相关的属性移动到application-internal.properties文件(位于jar中),并将Logback指向该文件( )让一切按预期工作!
${...}
在spring不是“springEL”; 他们是财产占位符。
我认为你将回弹“变量”与Spring“Property Placeholders”混淆了。
他们碰巧使用相同的语法${...}
。
logback对Spring属性占位符机制一无所知,反之亦然。 您需要根据logback文档配置您的logback变量,而不是在application.properties
/ application.yml
,这完全是Spring(boot)概念。
编辑:
快速查看logback文档后,添加
到logback.xml
应该工作。
从Spring Boot 1.3开始,您可以更好地将spring属性添加到logback-spring.xml配置中:
现在你可以添加一个“springProperty”元素。
${destination} ...
https://github.com/spring-projects/spring-boot/commit/055ace37f006120b0006956b03c7f358d5f3729f
编辑:感谢Anders
………
如上所述,您可以使用
元素访问spring引导属性…但需要记住的是,logback配置文件必须命名为logback-spring.xml
,如果您将其命名为logback-spring.xml
则不起作用file logback.xml
(我使用的是spring-boot 1.3.5.RELEASE
)
上面的解决方案主要用于bootrap.properties
。 但是,在我目前找到的logback配置中使用远程Spring Config Server的属性的唯一方法是以编程方式应用它们:
@Component public class LoggerConfiguration implements ApplicationListener { @Autowired protected Environment environment; @Override public void onApplicationEvent(EnvironmentChangeEvent event) { // enviroment here has already loaded all properties and you may alter logback config programatically ch.qos.logback.classic.Logger rootLogger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); } }
这是一个很好的例子,说明如何使用new appender以这种方式自定义logback。