logstash与logback不兼容问题处理NoSuchMethodError: ch.qos.logback.classic

从错误日志来看,关键报错是:

问题原因

这个错误表明 ILoggingEvent.getInstant() 方法找不到,通常是由于 logback-classic 版本不兼容 造成的。

net.logstash.logback 依赖 logback-classic 1.3+,而你的项目可能使用了 1.2.x 版本,导致找不到 getInstant() 方法(该方法是在 1.3 版本引入的)。

解决方案

1. 确保 logback-classic 版本 >= 1.3

如果你的 logback-classic 仍然是 1.2.x,需要升级到 1.3.x 以上。

Maven:

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.3.11</version>  <!-- 确保是 1.3+ 版本 -->
</dependency>Code language: HTML, XML (xml)

Gradle:

implementation 'ch.qos.logback:logback-classic:1.3.11'Code language: JavaScript (javascript)

然后 重新构建并运行

2. 降级 logstash-logback-encoder 版本

如果你的 logback-classic 不能升级(例如 Spring Boot 2.x 仍然使用 1.2.x),你可以降级 logstash-logback-encoder 到 6.6 或更早版本:

<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>6.6</version>  <!-- 6.6 兼容 logback 1.2 -->
</dependency>Code language: HTML, XML (xml)

然后重新运行项目。

3. 检查依赖冲突

如果你仍然遇到问题,可能是 logback-classic 依赖被其他库覆盖,运行以下命令检查实际使用的版本:

Maven:

mvn dependency:tree | grep logback

Gradle:

./gradlew dependencies --configuration runtimeClasspath | grep logback

如果发现多个 logback-classic 版本混用,可以在 pom.xml 里排除旧版本:

<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>7.4</version>
    <exclusions>
        <exclusion>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
        </exclusion>
    </exclusions>
</dependency>Code language: HTML, XML (xml)

然后 手动指定 logback-classic 版本,防止依赖冲突。

1.如果必须要用logstash7.x版本必须1升级 logback-classic 到 1.3.x 以上(推荐)。
2.如果必须使用 logback-classic 1.2.x,降级 logstash-logback-encoder 到 6.6 版本
3.检查是否有 logback-classic 版本冲突,确保项目使用的是兼容的依赖版本。

更多错误信息

报错了  java.lang.IllegalStateException: 启动子级时出错

                at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:602)

                at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:571)

                at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:603)

                at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1175)

                at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1888)

                at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)

                at java.util.concurrent.FutureTask.run(FutureTask.java:266)

                at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)

                at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112)

                at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:1086)

                at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:470)

                at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1584)

                at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:312)

                at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:109)

                at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:389)

                at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:336)

                at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:776)

                at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:721)

                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)

                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1203)

                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1193)

                at java.util.concurrent.FutureTask.run(FutureTask.java:266)

                at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)

                at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)

                at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:749)

                at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:211)

                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)

                at org.apache.catalina.core.StandardService.startInternal(StandardService.java:415)

                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)

                at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:874)

                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)

                at org.apache.catalina.startup.Catalina.start(Catalina.java:739)

                at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

                at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

                at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

                at java.lang.reflect.Method.invoke(Method.java:498)

                at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:345)

                at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:473)

        Caused by: org.apache.catalina.LifecycleException: 无法启动组件[StandardEngine[Catalina].StandardHost[localhost].StandardContext[/efunds]]

                at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:406)

                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:179)

                at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:599)

                … 37 more

        Caused by: java.lang.NoSuchMethodError: ch.qos.logback.classic.spi.ILoggingEvent.getInstant()Ljava/time/Instant;

                at net.logstash.logback.composite.loggingevent.LoggingEventFormattedTimestampJsonProvider.getTimestampAsInstant(LoggingEventFormattedTimestampJsonProvider.java:29)

                at net.logstash.logback.composite.loggingevent.LoggingEventFormattedTimestampJsonProvider.getTimestampAsInstant(LoggingEventFormattedTimestampJsonProvider.java:25)

                at net.logstash.logback.composite.AbstractFormattedTimestampJsonProvider.writeTo(AbstractFormattedTimestampJsonProvider.java:164)

                at net.logstash.logback.composite.JsonProviders.writeTo(JsonProviders.java:78)

                at net.logstash.logback.composite.AbstractCompositeJsonFormatter.writeEventToGenerator(AbstractCompositeJsonFormatter.java:290)

                at net.logstash.logback.composite.AbstractCompositeJsonFormatter$JsonFormatter.writeEvent(AbstractCompositeJsonFormatter.java:190)

                at net.logstash.logback.composite.AbstractCompositeJsonFormatter.writeEvent(AbstractCompositeJsonFormatter.java:156)

                at net.logstash.logback.encoder.CompositeJsonEncoder.encode(CompositeJsonEncoder.java:106)

                at net.logstash.logback.encoder.CompositeJsonEncoder.encode(CompositeJsonEncoder.java:92)

                at net.logstash.logback.encoder.CompositeJsonEncoder.encode(CompositeJsonEncoder.java:36)

                at ch.qos.logback.core.OutputStreamAppender.subAppend(OutputStreamAppender.java:230)

                at ch.qos.logback.core.OutputStreamAppender.append(OutputStreamAppender.java:102)

                at ch.qos.logback.core.UnsynchronizedAppenderBase.doAppend(UnsynchronizedAppenderBase.java:84)

                at ch.qos.logback.core.spi.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:51)

                at ch.qos.logback.classic.Logger.appendLoopOnAppenders(Logger.java:270)

                at ch.qos.logback.classic.Logger.callAppenders(Logger.java:257)

                at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:421)

                at ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.java:383)

                at ch.qos.logback.classic.Logger.log(Logger.java:765)

                at org.apache.commons.logging.LogAdapter$Slf4jLocationAwareLog.error(LogAdapter.java:440)

                at org.springframework.boot.SpringApplication.reportFailure(SpringApplication.java:818)

                at org.springframework.boot.SpringApplication.handleRunFailure(SpringApplication.java:782)

                at org.springframework.boot.SpringApplication.run(SpringApplication.java:318)

                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:4491)

                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)

                … 38 more

海拔科技

自媒体人,喜欢网络,热爱研究。本站头条号:星河 熊掌号:海拔科技

相关推荐

logback通过logstash-logback-encoder设置json格式输出

在 logback 中,你可以使用 logback-json-classic 或 logstash-logback-encoder 来输出 JSON 格式的日志。以下是两种常见的方式: 一、使用 logback-json-classic 这是 Logback 官方提供的 JSON 编码器,适用于 …