将应用程序部署到 tomcat 服务器时,Spring-boot 的内置记录器出现问题

Having an issue with Spring-boot's built-in logger when deploying app to tomcat server

我正在使用 MongoDB 数据库构建 Spring 启动应用程序,当应用程序部署到服务器并开始记录时,我 运行 遇到了问题。我在互联网上做了一些挖掘,我得到的所有答案是我需要以下 Maven 依赖项并进行安装。我已经这样做了,不幸的是问题仍然存在。

我目前正在使用 MongoDB 版本 4.4.11 和 Spring-boot 版本 2.6.1

pom.xml

<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>com.myproject</groupId>
        <artifactId>backend</artifactId>
        <version>3.2.0.RELEASE</version>
    </parent>

    <artifactId>pe</artifactId>
    <packaging>war</packaging>
    <name>myproject Backend Pe</name>

    <dependencies>
        <dependency>
            <groupId>com.myproject</groupId>
            <artifactId>core</artifactId>
            <version>3.2.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-properties-migrator</artifactId>
            <scope>runtime</scope>
        </dependency>
                 
    </dependencies>

    <properties>
        <start-class>com.myproject.mobileplatform_backend.app.Application</start-class>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <configuration>
                        <warName>pe</warName>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>exec-maven-plugin</artifactId>
                    <version>1.3.2</version>
                    <executions>
                    
                        <!-- installs node modules -->
                        <execution>
                            <id>npm install</id>
                            <goals>
                                <goal>exec</goal>
                            </goals>
                            <phase>generate-sources</phase>
                            <configuration>
                                <executable>npm</executable>
                                <arguments>
                                    <argument>install</argument>
                                </arguments>
                                <workingDirectory>${basedir}/src/main/frontend</workingDirectory>
                            </configuration>
                        </execution>
    
                        <!-- builds frontend -->
                        <execution>
                            <id>angular build</id>
                            <goals>
                                <goal>exec</goal>
                            </goals>
                            <phase>compile</phase>
                            <configuration>
                                <executable>ng</executable>
                                <arguments>
                                    <argument>build</argument>
                                    <argument>--prod</argument>
                                    <argument>--deploy-url</argument>
                                    <argument>dist/</argument>
                                </arguments>
                                <workingDirectory>${basedir}/src/main/frontend</workingDirectory>
                            </configuration>
                        </execution>                        
                    </executions>
                    
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

从本地主机读取..log:

14-Jan-2022 11:41:57.058 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log Closing Spring root WebApplicationContext
14-Jan-2022 11:42:15.809 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log 1 Spring WebApplicationInitializer detected on classpath
14-Jan-2022 11:42:24.270 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log Initializing Spring embedded WebApplicationContext
14-Jan-2022 11:42:32.293 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.filterStart Exception starting filter [errorPageSecurityFilter]
 java.lang.AbstractMethodError
    at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:285)
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:112)
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4590)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5233)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:752)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:728)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
    at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:630)
    at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1842)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

14-Jan-2022 11:42:32.323 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log Closing Spring root WebApplicationContext

部署到服务器时出错:

Exception in thread "cluster-ClusterId{value='61dde73d6257ab22798db558', description='null'}-localhost:27017" java.lang.NoClassDefFoundError: ch/qos/logback/classic/spi/ThrowableProxy
        at ch.qos.logback.classic.spi.LoggingEvent.<init>(LoggingEvent.java:119)
        at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:419)
        at ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.java:383)
        at ch.qos.logback.classic.Logger.info(Logger.java:595)
        at com.mongodb.diagnostics.logging.SLF4JLogger.info(SLF4JLogger.java:76)
        at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.logStateChange(DefaultServerMonitor.java:266)
        at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:164)
        at java.lang.Thread.run(Thread.java:745)
    Caused by: java.lang.ClassNotFoundException: Illegal access: this web application instance has been stopped already. Could not load [ch.qos.logback.classic.spi.ThrowableProxy]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
        at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForClassLoading(WebappClassLoaderBase.java:1301)
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1158)
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119)
        ... 8 more
    Caused by: java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [ch.qos.logback.classic.spi.ThrowableProxy]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
        at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1311)
        at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForClassLoading(WebappClassLoaderBase.java:1299)
        ... 10 more
    Exception in thread "cluster-ClusterId{value='61dde7416257ab22798db559', description='null'}-localhost:27017" java.lang.NoClassDefFoundError: ch/qos/logback/classic/spi/ThrowableProxy
        at ch.qos.logback.classic.spi.LoggingEvent.<init>(LoggingEvent.java:119)
        at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:419)
        at ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.java:383)
        at ch.qos.logback.classic.Logger.info(Logger.java:595)
        at com.mongodb.diagnostics.logging.SLF4JLogger.info(SLF4JLogger.java:76)
        at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.logStateChange(DefaultServerMonitor.java:266)
        at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:164)
        at java.lang.Thread.run(Thread.java:745)
    Exception in thread "cluster-ClusterId{value='61dde7416257ab22798db55a', description='null'}-localhost:27017" java.lang.NoClassDefFoundError: ch/qos/logback/classic/spi/ThrowableProxy
        at ch.qos.logback.classic.spi.LoggingEvent.<init>(LoggingEvent.java:119)
        at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:419)
        at ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.java:383)
        at ch.qos.logback.classic.Logger.info(Logger.java:595)
        at com.mongodb.diagnostics.logging.SLF4JLogger.info(SLF4JLogger.java:76)
        at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.logStateChange(DefaultServerMonitor.java:266)
        at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:164)
        at java.lang.Thread.run(Thread.java:745)

第二个错误:

Exception in thread "cluster-ClusterId{value='61e1a55b4e705712d5c92121', description='null'}-localhost:27017" java.lang.NoClassDefFoundError: com/mongodb/internal/connection/DecimalFormatHelper
    at com.mongodb.connection.ServerDescription.getRoundTripFormattedInMilliseconds(ServerDescription.java:1041)
    at com.mongodb.connection.ServerDescription.getShortDescription(ServerDescription.java:1016)
    at com.mongodb.connection.ClusterDescription.getShortDescription(ClusterDescription.java:327)
    at com.mongodb.internal.connection.BaseCluster.updateDescription(BaseCluster.java:245)
    at com.mongodb.internal.connection.SingleServerCluster.publishDescription(SingleServerCluster.java:125)
    at com.mongodb.internal.connection.SingleServerCluster.publishDescription(SingleServerCluster.java:116)
    at com.mongodb.internal.connection.SingleServerCluster.access0(SingleServerCluster.java:41)
    at com.mongodb.internal.connection.SingleServerCluster$DefaultServerDescriptionChangedListener.serverDescriptionChanged(SingleServerCluster.java:107)
    at com.mongodb.internal.connection.DefaultSdamServerDescriptionManager.updateDescription(DefaultSdamServerDescriptionManager.java:127)
    at com.mongodb.internal.connection.DefaultSdamServerDescriptionManager.update(DefaultSdamServerDescriptionManager.java:81)
    at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:165)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: Illegal access: this web application instance has been stopped already. Could not load [com.mongodb.internal.connection.DecimalFormatHelper]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
    at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForClassLoading(WebappClassLoaderBase.java:1301)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1158)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119)
    ... 12 more
Caused by: java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [com.mongodb.internal.connection.DecimalFormatHelper]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
    at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1311)
    at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForClassLoading(WebappClassLoaderBase.java:1299)
    ... 14 more
Exception in thread "cluster-ClusterId{value='61e1a55c4e705712d5c92122', description='null'}-localhost:27017" java.lang.NoClassDefFoundError: com/mongodb/internal/connection/DecimalFormatHelper
    at com.mongodb.connection.ServerDescription.getRoundTripFormattedInMilliseconds(ServerDescription.java:1041)
    at com.mongodb.connection.ServerDescription.getShortDescription(ServerDescription.java:1016)
    at com.mongodb.connection.ClusterDescription.getShortDescription(ClusterDescription.java:327)
    at com.mongodb.internal.connection.BaseCluster.updateDescription(BaseCluster.java:245)
    at com.mongodb.internal.connection.SingleServerCluster.publishDescription(SingleServerCluster.java:125)
    at com.mongodb.internal.connection.SingleServerCluster.publishDescription(SingleServerCluster.java:116)
    at com.mongodb.internal.connection.SingleServerCluster.access0(SingleServerCluster.java:41)
    at com.mongodb.internal.connection.SingleServerCluster$DefaultServerDescriptionChangedListener.serverDescriptionChanged(SingleServerCluster.java:107)
    at com.mongodb.internal.connection.DefaultSdamServerDescriptionManager.updateDescription(DefaultSdamServerDescriptionManager.java:127)
    at com.mongodb.internal.connection.DefaultSdamServerDescriptionManager.update(DefaultSdamServerDescriptionManager.java:81)
    at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:165)
    at java.lang.Thread.run(Thread.java:745)
Exception in thread "cluster-ClusterId{value='61e1a5544e705712d5c92120', description='null'}-localhost:27017" java.lang.NoClassDefFoundError: com/mongodb/internal/connection/DecimalFormatHelper
    at com.mongodb.connection.ServerDescription.getRoundTripFormattedInMilliseconds(ServerDescription.java:1041)
    at com.mongodb.connection.ServerDescription.getShortDescription(ServerDescription.java:1016)
    at com.mongodb.connection.ClusterDescription.getShortDescription(ClusterDescription.java:327)
    at com.mongodb.internal.connection.BaseCluster.updateDescription(BaseCluster.java:245)
    at com.mongodb.internal.connection.SingleServerCluster.publishDescription(SingleServerCluster.java:125)
    at com.mongodb.internal.connection.SingleServerCluster.publishDescription(SingleServerCluster.java:116)
    at com.mongodb.internal.connection.SingleServerCluster.access0(SingleServerCluster.java:41)
    at com.mongodb.internal.connection.SingleServerCluster$DefaultServerDescriptionChangedListener.serverDescriptionChanged(SingleServerCluster.java:107)
    at com.mongodb.internal.connection.DefaultSdamServerDescriptionManager.updateDescription(DefaultSdamServerDescriptionManager.java:127)
    at com.mongodb.internal.connection.DefaultSdamServerDescriptionManager.update(DefaultSdamServerDescriptionManager.java:81)
    at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:165)
    at java.lang.Thread.run(Thread.java:745)

我认为您面临的主要问题与 localhost.log 中出现的错误有关:

14-Jan-2022 11:42:32.293 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.filterStart Exception starting filter [errorPageSecurityFilter]
 java.lang.AbstractMethodError
    at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:285)

该错误与 Tomcat 无法成功初始化 ErrorPageSecurityFilter 有关。

此过滤器试图防止未经授权访问应用程序错误页面。

它是在 Spring Boot 2.6.0 中引入的。

过滤器最初是作为 Servlet 4.0 HttpFilter

如您在 history of changes of the component 中所见,这一事实导致了不同的更改,以便为不支持 Servlet 4.0 版本的容器提供支持。

这些更改已记录在不同的问题中,主要是 this, although there are other related ones 1 2 3

基本上,您可以查看上述组件的历史记录,他们 first 重构过滤器以实现 Filter 而不是扩展 HttpFilter.

在 Servlet 4 版本中,Filter 接口为 ErrorPageSecurityFilter 本身的 init and destroy. To mimic this behavior and make it Servlet 3.x compatible, in a later change, the Spring developers provided a no-op implementation of init 提供了默认方法实现。

如您在更改日志中所见,最后一个问题已在 Spring Boot 2.6.2 中修复。

在应用程序启动时,Tomcat 找到并尝试初始化 ErrorPageSecurityFilter 过滤器,但您可能正在使用 a version of Tomcat still not Servlet 4 version compliant,并且根据 Spring 启动的版本,您是使用 2.6.1,此过滤器不提供 init 实现,这就是 Tomcat 抱怨 AbstractMethodError.

的原因

为了解决问题,请考虑将您的应用程序依赖项更新到 Spring Boot 2.6.2.

我认为一旦更新,与部署相关的不同错误就会消失,它们似乎是由线程或 class 加载问题引起的 Tomcat 由于 ErrorPageSecurityFilter相关错误。

这可能是因为 spring-data 和 db-driver 依赖的版本不兼容。请检查 db-driver 的版本是否与提供的 spring-data 依赖项兼容。

试试这个版本: MongoDB 4.4.11

的 SpringBoot 2.5.6

如果需要 SpringBoot 2.6.1,请尝试:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

对于 mongo 依赖。

好像是这个问题:

https://gitmetadata.com/repo/spring-projects/spring-boot/issues/29135

您可以在您的 pom 中强制使用 tomcat 9 和以下 属性:

<properties>
    <tomcat.version>9.0.55</tomcat.version>
<properties>

虽然 tomcat spring-boot 2.6.1 的嵌入式版本应该是 9.0.55