我在一个独特的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上下文参数。有任何解决方法吗?感谢。
答案 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"/>