The following simple war archive fails to deploy to a Apache Tomcat/9.0.58 as war file.

@SpringBootApplication
public class MainApp extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(MainApp.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(MainApp.class);
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>org.example.logging</groupId>
    <artifactId>spring-web-logging-test</artifactId>
    <version>1.0.0</version>
    <packaging>war</packaging>

    <properties>
        <java.version>11</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>

The result is strange, because I did not instruct spring to use log4j in any way here.

Result:

01-Mar-2022 13:27:49.510 INFO [http-nio-8080-exec-335] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/opt/tomcat/webapps/spring-web-logging-test-1.0.0.war]
01-Mar-2022 13:27:50.198 INFO [http-nio-8080-exec-335] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
01-Mar-2022 13:27:50.326 SEVERE [http-nio-8080-exec-335] org.apache.catalina.startup.HostConfig.deployWAR Error deploying web application archive [/opt/tomcat/webapps/spring-web-logging-test-1.0.0.war]
        java.lang.IllegalStateException: Error starting child
                at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:729)
                at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:698)
                at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:696)
                at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1024)
                at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:544)
                at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1690)
                at jdk.internal.reflect.GeneratedMethodAccessor1038.invoke(Unknown Source)
                at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
                at java.base/java.lang.reflect.Method.invoke(Method.java:566)
                at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:293)
                at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:809)
                at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
                at org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1614)
                at org.apache.catalina.manager.HTMLManagerServlet.upload(HTMLManagerServlet.java:292)
                at org.apache.catalina.manager.HTMLManagerServlet.doPost(HTMLManagerServlet.java:210)
                at javax.servlet.http.HttpServlet.service(HttpServlet.java:681)
                at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
                at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
                at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
                at org.apache.catalina.filters.CsrfPreventionFilter.doFilter(CsrfPreventionFilter.java:211)
                at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
                at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
                at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
                at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
                at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
                at org.apache.catalina.filters.HttpHeaderSecurityFilter.doFilter(HttpHeaderSecurityFilter.java:126)
                at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
                at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
                at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
                at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
                at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:659)
                at org.apache.catalina.valves.RequestFilterValve.process(RequestFilterValve.java:378)
                at org.apache.catalina.valves.RemoteAddrValve.invoke(RemoteAddrValve.java:56)
                at org.apache.catalina.valves.RequestFilterValve.process(RequestFilterValve.java:378)
                at org.apache.catalina.valves.RemoteAddrValve.invoke(RemoteAddrValve.java:56)
                at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
                at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
                at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
                at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)
                at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:769)
                at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
                at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:359)
                at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
                at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
                at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:889)
                at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1735)
                at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
                at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
                at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
                at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
                at java.base/java.lang.Thread.run(Thread.java:829)
        Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/spring-web-logging-test-1.0.0]]
                at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
                at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:726)
                ... 50 more
        Caused by: java.lang.IllegalStateException: java.lang.ClassNotFoundException: org.apache.logging.log4j.spring.boot.Log4j2CloudConfigLoggingSystem
                at org.springframework.boot.logging.LoggingSystem.get(LoggingSystem.java:172)
                at org.springframework.boot.logging.LoggingSystem.get(LoggingSystem.java:157)
                at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationStartingEvent(LoggingApplicationListener.java:231)
                at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:213)
                at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)
                at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169)
                at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143)
                at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:131)
                at org.springframework.boot.context.event.EventPublishingRunListener.starting(EventPublishingRunListener.java:79)
                at org.springframework.boot.SpringApplicationRunListeners.lambda$starting$0(SpringApplicationRunListeners.java:56)
                at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
                at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:120)
                at org.springframework.boot.SpringApplicationRunListeners.starting(SpringApplicationRunListeners.java:56)
                at org.springframework.boot.SpringApplication.run(SpringApplication.java:294)
                at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:175)
                at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:155)
                at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:97)
                at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:174)
                at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5219)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                ... 51 more
        Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.spring.boot.Log4j2CloudConfigLoggingSystem
                at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1407)
                at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1215)
                at java.base/java.lang.Class.forName0(Native Method)
                at java.base/java.lang.Class.forName(Class.java:398)
                at org.springframework.util.ClassUtils.forName(ClassUtils.java:284)
                at org.springframework.boot.logging.LoggingSystem.get(LoggingSystem.java:166)
                ... 70 more
01-Mar-2022 13:27:50.328 INFO [http-nio-8080-exec-335] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/opt/tomcat/webapps/spring-web-logging-test-1.0.0.war] has finished in [818] ms

Comment From: wilkinsona

Something has set the org.springframework.boot.logging.LoggingSystem system property to org.apache.logging.log4j.spring.boot.Log4j2CloudConfigLoggingSystem. This is out of Spring Boot's control. I suspect it's somewhere in your Tomcat configuration.

Comment From: membersound

Well but the following command just returns no match. Where should I have configured it, accidentally? sudo find /opt/tomcat -type f -exec grep -Flm 1 'Log4j2CloudConfigLoggingSystem' {} +

Comment From: membersound

Got it partially: if there is another *.war file inside the same tomcat, that included the following dependency, then this example project fails to start!

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-spring-boot</artifactId>
        </dependency>

Probably: https://github.com/apache/logging-log4j2/blob/release-2.x/log4j-spring-boot/src/main/java/org/apache/logging/log4j/spring/boot/Log4j2CloudConfigLoggingSystem.java

The question is: is that intentional that this spring-boot dependency has an impact on all other projects inside the same tomcat?

Throwing the following dependencies in also on this example project fixes the problem, but I still wonder if this is intentionally?

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-spring-boot</artifactId>
        </dependency>

Comment From: wilkinsona

The question is: is that intentional that this spring-boot dependency has an impact on all other projects inside the same tomcat?

I don't know. That's a question for the maintainers of Log4j 2.

I think the problem's caused by this Log4j2.system.properties file. AIUI, Log4j2 finds that file and sets as system properties each entry in it. As you've seen, that's rather brittle in cases where multiple unrelated applications can be deployed in the same JVM.

Comment From: membersound

Added issue on the Log4j2 maintainers side. Unfortunately they're still using Jira. Thanks for your ideas!

https://issues.apache.org/jira/browse/LOG4J2-3422