在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.propertieslog4j2-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'”

在tomcat 8上部署战争时未加载Spring Boot应用程序

在一个 Tomcat 上运行多个 Spring-boot 应用程序