Java 无法在logback.xml中使用Spring属性占位符
我有一个使用Logback的Spring引导控制台应用程序。所有属性(对于应用程序以及Logback)都外部化到类路径中的标准application.properties文件中。这些属性在应用程序本身中可以很好地获取,但在logback.xml文件中无法获取。看起来好像logback.xml是在Spring启动之前处理的,因此EL占位符不会被处理 以FileNamePattern为例,在application.properties中,我有如下内容:Java 无法在logback.xml中使用Spring属性占位符,java,spring,spring-boot,logback,Java,Spring,Spring Boot,Logback,我有一个使用Logback的Spring引导控制台应用程序。所有属性(对于应用程序以及Logback)都外部化到类路径中的标准application.properties文件中。这些属性在应用程序本身中可以很好地获取,但在logback.xml文件中无法获取。看起来好像logback.xml是在Spring启动之前处理的,因此EL占位符不会被处理 以FileNamePattern为例,在application.properties中,我有如下内容: log.filePattern=/%d{yyy
log.filePattern=/%d{yyyy/MM-MMMM/dd-EEEE}
在logback.xml中,我将有以下内容:
${log.logDirectory}${log.filePattern}.log
运行应用程序时,我会看到以下错误:
ch.qos.logback.core.joran.spi中的错误。Interpreter@24:25 -
标记[rollingPolicy]的运行时异常正在运行
java.lang.IllegalStateException:FileNamePattern
[log.logDirectory\u是\u未定义的log.filePattern\u是\u未定义的.log]
不包含有效的DateToken
类似的代码在其他Spring(而不是SpringBoot)应用程序中也能正常工作,所以我很好奇SpringBoot是否表现得有点不同
解决方案:
谢谢你的回复@Gary!很高兴了解Spring EL和Logback变量之间的区别……我假设是Spring负责为我解析这些变量。我确实有这个元素,但这让我开始思考
我的application.properties文件在jar之外,所以Logback不知道在哪里可以找到它。通过将我的Spring相关属性保留在我的external application.properties文件中,将日志相关属性移动到application-internal.properties文件中(位于jar内部),并将Logback指向该文件(
),一切都按预期工作 ${…}
不是春季的“春季EL”;它们是属性占位符
我认为您混淆了logback“变量”和Spring“属性占位符”
它们恰好使用了相同的语法${…}
logback对Spring属性占位符机制一无所知,反之亦然。您需要根据logback文档而不是application.properties
/application.yml
配置您的logback变量,这是严格意义上的Spring(启动)概念
编辑:
快速查看logback文档后,添加
到
logback.xml
应该可以工作。自Spring Boot 1.3以来,您有一种更好的方法将Spring属性添加到logback-Spring.xml配置中:
现在您可以添加一个“springProperty”元素
编辑:感谢安德斯
如上所述,您可以使用
元素访问spring boot属性……但需要记住的是,logback配置文件必须命名为logback spring.xml
,如果您将文件命名为logback.xml
(我使用的是spring boot 1.3.5.RELEASE
)上述解决方案主要用于bootrap.properties
。但是,在我目前找到的logback配置中使用远程Spring配置服务器属性的唯一方法是通过编程应用它们:
@Component
public class LoggerConfiguration implements ApplicationListener<EnvironmentChangeEvent> {
@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);
}
}
@组件
公共类LoggerConfiguration实现ApplicationListener{
@自动布线保护环境;
@凌驾
ApplicationEvent上的公共无效(环境更改事件){
//此处的环境已经加载了所有属性,您可以通过编程更改logback配置
ch.qos.logback.classic.Logger rootLogger=(ch.qos.logback.classic.Logger)LoggerFactory.getLogger(Logger.ROOT\u Logger\u NAME);
}
}
这是一个很好的示例,说明如何通过这种方式使用新的appender自定义logback。有一种方法可以将Spring属性映射到logback属性,并在以下条件下使用它们:
logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<springProperty scope="context" name="ACTIVE_PROFILE" source="spring.profiles.active"/>
<!-- defined in the application-prod.properties/>-->
<springProperty scope="context" name="SPRING_WRITER_DISABLED" source="writer.disabled"/>
<property name="LOGBACK_WRITER_DISABLED" value="${SPRING_WRITER_DISABLED}"/>
<if condition='property("LOGBACK_WRITER_DISABLED").equals("false")'>
<then>
<appender name="testappender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${ACTIVE_PROFILE}/${HOSTNAME}/testappender.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>
{ACTIVE_PROFILE}/${HOSTNAME}/testappender-%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<maxFileSize>300MB</maxFileSize>
<maxHistory>3</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<logger name="testappender" level="INFO" additivity="false">
<appender-ref ref="testappender"/>
</logger>
</then>
</if>
</configuration>
logback-spring.xml
${ACTIVE_PROFILE}/${HOSTNAME}/testappender.log
{ACTIVE_PROFILE}/${HOSTNAME}/testappender-%d{yyyy-MM-dd}.%i.log
300MB
3.
1GB
%消息%n
这里是指向“logback文档”的链接:@Gary我想要可配置的文件模式扩展名。这可能吗?或者我想用外部logback.xml覆盖内部logback.xml。这可能吗?对于一个外部文件(不在类路径中,但在文件系统中可用):感谢您丢失了voodoo(属性资源)。仅供参考:“application.yml”也适用于。。。正如我在这里介绍的:使用logback-dev.xml
和logback-prod.xml
与spring boot 1.3.3.RELEASE
对我有效。如果仍然不起作用,请检查应用程序配置名称,它应该是application.properties,或者您为应用程序指定的任何名称。在这种情况下,额外的@PropertySource es似乎不起作用还有一件事需要记住:至少对我来说,直到我将application.properties
重命名为bootstrap.properties
之后,它才开始工作。是否有一个logback-spring.groovy等效于这个^^^?这个东西的文档在哪里?MatthewPayne你有没有发现如何在groovy中做到这一点?这不是一个简单的解决方案。如果您通过包含一个外部文件将logback-spring.xml文件外部化,然后将sya“maxSize”从100MB更改为2KB,您将看到文件被创建为destination_IS_UNDEFINED.log。这是因为正如@Gary Russell在他的回答中所解释的那样。