在log4j2.xml中使用Spring启动应用程序属性

时间:2018-02-23 04:25:57

标签: spring-boot log4j2

我正在开发基于spring boot的Web应用程序,并希望使用log4j2作为记录器实现 使用 log4j2-spring.xml 文件中定义的日志记录配置,一切正常。

什么不起作用:我想在log4j2-spring.xml文件中使用属性占位符,该文件应该从用于配置spring boot的 application.yml 文件中定义的属性中解析。

这可能吗?如果是,怎么样?

3 个答案:

答案 0 :(得分:7)

通过属性占位符直接替换log4j2-spring.xml中的属性,因为log4j2-spring.xml超出了Spring的范围,并且纯粹用于配置目的。

但是,您可以利用here概述的Log4j2属性替换的开箱即用功能。

第1步 - 在log4j2-spring.xml中指定属性名称及其变量,如下所示

<Configuration status="warn">
    <Properties>
        <Property name="someProp">${bundle:test:someKey}</Property>
    </Properties> 
    <!--other configs -->
</Configuration>

第2步 - 在日志配置中使用上面定义的属性,例如。后缀记录文件名

<Appenders>
    <File name="file" fileName="/path/to/logs/app-${someProp}.log">
        <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %-40c{1.} - %m%n"/>
    </File>
</Appenders>

第3步 - 创建捆绑即属性文件)以保存属性值,例如。 test.properties

# properties for log4j2
someKey=someValue
someKey1=someValue1

在您的情况下,此文件将包含您在log4j2配置中使用的yaml中的值。如果在应用程序中也使用了这些属性,它们将在yaml和bundle( ie属性文件)中重复,这应该是可接受的,因为spring不能在log4j2配置中注入它们。

如果需要更多信息,请在评论中告知。

答案 1 :(得分:1)

我在将Spring Boot YAML属性注入到log4j xml配置中时遇到了类似的问题,我找到了Spring Boot 1.5.X(可能是2.0,我没有测试过)的解决方案,这有点棘手,对系统属性查找进行操作,但肯定可以。

假设您在应用程序中具有配置文件“ dev”,并且需要注入一些属性,那么您的 application-dev.yml 看起来像这样:

property:
    toInject: someValue

在您的xml配置 log4j2-spring-dev.xml 中,您输入了以下内容:

<Properties>
    <property name="someProp">${sys:property.toInject}</property>
</Properties>

现在,您必须以某种方式将此spring属性转移到system属性。您必须在准备好应用程序环境之后并且在初始化日志记录系统之前执行此操作。在Spring Boot中,有一个监听器LoggingApplicationListener,它初始化整个日志记录系统,并由事件ApplicationEnvironmentPreparedEvent触发,因此让我们以比LoggingApplicationListener优先级高的顺序创建监听器:

public class LoggingListener implements ApplicationListener, Ordered {

@Override
public int getOrder() {
    return LoggingApplicationListener.DEFAULT_ORDER - 1;
}

@Override
public void onApplicationEvent(ApplicationEvent event) {
    if (event instanceof ApplicationEnvironmentPreparedEvent) {
        ConfigurableEnvironment environment = ((ApplicationEnvironmentPreparedEvent) event).getEnvironment();
        List<String> activeProfiles = Arrays.asList(environment.getActiveProfiles());
        if (!activeProfiles.contains("dev")) {
            return;
        }

        String someProp = environment.getProperty("property.toInject")
        validateProperty(someProp);

        System.setProperty("property.toInject", someProp);
    }
}

现在在您的应用程序中注册此侦听器:

public static void main(String[] args) {
    SpringApplication application = new SpringApplication(MyApplication.class);
    application.addListeners(new LoggingListener());
    application.run(args);
}

就是这样。您的Spring Boot属性应该“注入”到log4j2配置文件中。该解决方案与类路径属性和--spring.config.location属性一起使用。请注意,它不适用于某些外部配置系统,例如Spring Cloud Config。

希望有帮助

答案 2 :(得分:0)

如果你使用 mvn,你可以使用 mvn 资源插件。这将让您在构建时间内实现目标。

链接:https://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html