logfellow/logstash-logback-encoder

Upgrade to 7.3 causes: Could not invoke method setProviders

hjannasch opened this issue · 2 comments

Spring Boot Version 2.7.8
Logback version 1.2.11
Java Version latest 17 LTS

After upgrading to 7.3 the following exception is throws during Spring Boot startup:

ERROR in ch.qos.logback.core.joran.spi.Interpreter@9:17 - no applicable action for [mdc], current ElementPath  is [[configuration][appender][encoder][providers][mdc]]
ERROR in ch.qos.logback.core.joran.util.PropertySetter@50adedaa - Could not invoke method setProviders in class net.logstash.logback.encoder.LogstashEncoder with parameter of type net.logstash.logback.composite.JsonProviders java.lang.reflect.InvocationTargetException
		at org.springframework.boot.context.logging.LoggingApplicationListener.initializeSystem(LoggingApplicationListener.java:344)
		at org.springframework.boot.context.logging.LoggingApplicationListener.initialize(LoggingApplicationListener.java:298)
		at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEnvironmentPreparedEvent(LoggingApplicationListener.java:246)
		at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:223)
		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.environmentPrepared(EventPublishingRunListener.java:85)
		at org.springframework.boot.SpringApplicationRunListeners.lambda$environmentPrepared$2(SpringApplicationRunListeners.java:66)
		at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
		at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:120)
		at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:114)
		at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:65)
		at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:343)
		at org.springframework.boot.SpringApplication.run(SpringApplication.java:301)
		at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:136)
		at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:141)
		at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:90)
		... 83 more
	Caused by: java.lang.IllegalStateException: Logback configuration error detected: 

My logback-spring.xml look like:

xml<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <springProfile name="!local">
    <!-- Use JSON format for processing with Filebeat -->
    <appender name="jsonConsoleAppender" class="ch.qos.logback.core.ConsoleAppender">
      <encoder class="net.logstash.logback.encoder.LogstashEncoder">
        <providers>
          <mdc/>
        </providers>
      </encoder>
    </appender>
    <root level="INFO">
      <appender-ref ref="jsonConsoleAppender"/>
    </root>
  </springProfile>

  <springProfile name="local">
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
  </springProfile>
</configuration>

When removing the mdc provider tag the error is gone. Is this tag deprecated?

Hi @hjannasch

net.logstash.logback.encoder.LogstashEncoder does not allow setting providers using the <providers> element. (Only net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder allows using the <providers> element)

Prior to 7.3, logstash-logback-encoder would ignore the invalid configuration and continue.

In 7.3, logstash-logback-encoder will throw an exception for the invalid configuration. (#861)

You likely did not notice this previously, because the mdc provider is included by default in net.logstash.logback.encoder.LogstashEncoder. Therefore, there is no need to explicitly include it.

If you would like to add additional providers to a net.logstash.logback.encoder.LogstashEncoder (which are not included by default), then you can use the <provider class="..."> element

Thanks for your feedback. I will remove the mdc provider from the config file.