Spring Boot:在logback配置中使用Tomcat上下文参数

时间:2016-02-29 15:52:03

标签: spring-boot logback tomcat8

我在一个独特的Tomcat中部署了几个Spring Boot应用程序实例。 每个应用程序都配置了一个context.xml文件,其中包含客户代码

<Context path="/myApp1" reloadable="false">
    <Parameter name="CUSTOMER_CODE" value="CUSTOMER1" />
</Context>

我希望每个客户都有一个基于context.xml中定义的代码的单独日志。

不幸的是,这个配置在我的logback-config.xml中不起作用:

<property name="LOG_FILE" value="${ROOT_LOG}/${CUSTOMER_CODE}/myApp.log}"/>

在“ROOT_LOG”目录中创建文件夹CUSTOMER_CODE_IS_UNDEFINED。 “ROOT_LOG”由系统属性提供。

有没有办法让这个回归配置工作?

application.properties中定义的属性的使用效果很好(我将logback.xml重命名为logback-spring.xml)。在我看来,在初始化日志记录之前,Spring引导不会在Environnement中设置Tomcat上下文参数。有任何解决方法吗?感谢。

1 个答案:

答案 0 :(得分:1)

我终于找到了一个解决方案,可以在记录初始化之前在Spring Environment bean中获取我的客户代码。不是很漂亮,但是它起作用了:

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application extends SpringBootServletInitializer {

  public static String APP_CUSTOMER_CODE;

  /**
   * Initialization of Spring Boot App with context param customer code
   */
  @Override
  protected SpringApplicationBuilder configure(final SpringApplicationBuilder builder) {
    final Map<String, Object> initProps = new HashMap<>();
    initProps.put("CUSTOMER_CODE", APP_CUSTOMER_CODE);
    return builder.properties(initProps).sources(Application.class);
  }

  /**
   * Method called before Spring Initialization
   */
  @Override
  public void onStartup(final ServletContext servletContext) throws ServletException {
    APP_CUSTOMER_CODE = servletContext.getInitParameter("CUSTOMER_CODE");
    super.onStartup(servletContext);
  }

}

另外,我必须在logback-spring.xml中声明一个 springProperty 标记来使用变量:

 <springProperty name="CUSTOMER_CODE" source="CUSTOMER_CODE"/>