在tomcat上部署多个Spring Boot应用程序时如何指定logging.config
Posted
技术标签:
【中文标题】在tomcat上部署多个Spring Boot应用程序时如何指定logging.config【英文标题】:How to specify logging.config when multiple Spring Boot Apps are deployed on tomcat 【发布时间】:2019-07-28 15:27:54 【问题描述】:我有多个 Spring Boot 应用程序(X、Y、Z)打包为部署在我的 tomcat 上的 war 文件。我想使用 log4j2 作为我的应用程序的日志系统。因此,要更改说 X 的日志系统,在 tomcat 中,我将 Sping Boot Propery 'logging.config' 值设置为指向 /tomcat/apps/X/WEB-INF/classes/log4j2-spring.properties。通过执行此日志记录,X 可以正常工作。
闪回: 如果我们在 application.properties 中指定 logging.config=classpath:log4j2.properties,那么当我们在 Eclipse 中作为 Java 应用程序运行时,日志记录就会起作用。但是,当我们将它作为 WAR 文件部署在 tomcat 上时,Logging 不起作用。 为了让它工作,我不得不把 logging.config= Path-to-myapp/log4j2.properties 放在 tomcat/bin/setenv.bat 中。
我的问题是如果我有多个应用程序,那么如何为每个 Spring Boot 应用程序设置 logging.config。
由于在创建 ApplicationContext 之前初始化日志记录, 在 Spring 中无法控制来自 @PropertySources 的日志记录 @配置文件。更改日志系统的唯一方法或 完全禁用它是通过系统属性。
【问题讨论】:
【参考方案1】:我已重命名 application.properties 并通过进行以下更改来设置 log4j 配置:
public class MyApplication extends SpringBootServletInitializer
public static void main(String[] args)
new SpringApplicationBuilder(MyApplication.class)
.properties("spring.config.name:new-app-properties-name")
.build()
.run(args);
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
return application.sources(MyApplication.class).properties("spring.config.name: new-app-properties-name");
/**
* Set log4j2.xml location
*/
@Override
public void onStartup(ServletContext servletContext) throws ServletException
servletContext.setInitParameter("logging.config", "/my-app/config/log4j2.xml");
super.onStartup(servletContext);
【讨论】:
onStartup 在我的情况下没有被调用【参考方案2】:我遇到了类似的问题,在这种情况下,我进行了以下更改:
像您一样从应用程序中外部化 log4j2.properties 文件,提到了 .env 文件中文件的外部位置。(在您的情况下,它位于 tomcat 的 .bat 文件中)。每个 spring boot 只引用这个文件。 在该 log4j2.properties 文件中,我们为每个服务创建了单独的 appender 和 logger,并对其进行了配置。这不是一个精确的解决方案,但在某些方面它是有效的。
对于每项服务,如果您想这样做,则意味着您必须创建每个文件和位置以及所有...并且在某个点之后就无法管理。
正如前面评论中提到的,需要某种机制以有条理和有条理的方式处理这种情况。
【讨论】:
【参考方案3】:我认为有一个错误。 log4j2.properties/log4j2-spring.properties 和 log4j2-spring.xml 的行为不一样。如果我们使用 log4j2.properties,那么应该指定 logging.config=classpath:log4j2.properties。另一方面,如果我们使用log4j2-spring.xml,则不需要指定logging.config。
在我看来,这是一个需要修复的重要错误,以允许多个 Spring Boot 应用程序部署在同一台服务器上。
应进行修复以支持 org.springframework.boot.logging.log4j2.Log4J2LoggingSystem.getCurrentlySupportedConfigLocations()
中的 log4j2.properties【讨论】:
【参考方案4】:您可以为每个应用程序定义自定义日志记录路径,如下所示:
logging:
level:
root: INFO
org.apache.http: ERROR
file: $catalina.base:./logs/app-$app-number.log
pattern:
file: $logPattern
console: $logPattern
【讨论】:
以上是关于在tomcat上部署多个Spring Boot应用程序时如何指定logging.config的主要内容,如果未能解决你的问题,请参考以下文章
多个Spring Boot项目部署在一个Tomcat容器无法启动
如何在嵌入式 tomcat 服务器上部署 Spring Boot Web 应用程序,来自 Spring Boot 本身
在Tomcat上部署Spring Boot应用程序时如何打开角度网页?
在 tomcat 9 上部署 Spring Boot Web 应用程序时,出现错误“无法检索系统属性'spring.xml.ignore'”