Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法在logback.xml中使用Spring属性占位符_Java_Spring_Spring Boot_Logback - Fatal编程技术网

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

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

我有一个使用Logback的Spring引导控制台应用程序。所有属性(对于应用程序以及Logback)都外部化到类路径中的标准application.properties文件中。这些属性在应用程序本身中可以很好地获取,但在logback.xml文件中无法获取。看起来好像logback.xml是在Spring启动之前处理的,因此EL占位符不会被处理

以FileNamePattern为例,在application.properties中,我有如下内容:

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在他的回答中所解释的那样。