logfellow/logstash-logback-encoder

Decorator YamlJsonFactoryDecorator and others changing output format does not seem to work

MichalKoziorowski-TomTom opened this issue · 2 comments

Describe the bug

Using YamlJsonFactoryDecorator to get output in yaml does not seem to work.
I'm using spring boot app with logback.xml:

<?xml version="1.0" encoding="UTF-8"?>

<configuration scan="true" scanPeriod="5 seconds">
  <!-- Appender that directs all output to console -->
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="net.logstash.logback.encoder.LogstashEncoder">
      <jsonFactoryDecorator class="net.logstash.logback.decorate.yaml.YamlJsonFactoryDecorator"/>
    </encoder>
  </appender>
  
  <root level="INFO">
    <appender-ref ref="STDOUT"/>
  </root>
</configuration>

The result I only see is:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.7.8)

I think that's spring output before logging is even initialized.

When I remove decorator, I'm getting standard json output.
I see similar problem when using decorators for Smile and other that modifies output format.

  • logstash-logback-encoder 7.2
  • logback version 1.2.11
  • jackson version 2.13.4
  • java version OpenJDK Runtime Environment Temurin-17.0.2+8 (build 17.0.2+8)

Hi @MichalKoziorowski-TomTom

Thanks for the report. I have reproduced the behavior you are seeing. It appears that the regression was introduced in version 7.0 of logstash-logback-encoder.

The only workaround I can propose is to downgrade to 6.6 until we get a fix released.

For reference, the underlying problem can be seen by adding a logback status listener to the config..

<statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />

then the following error will be output when an event is logged...

11:56:16,634 |-ERROR in ch.qos.logback.core.ConsoleAppender[STDOUT] - Appender [STDOUT] failed to append. java.lang.UnsupportedOperationException
	at java.lang.UnsupportedOperationException
	at 	at com.fasterxml.jackson.core.JsonGenerator.setRootValueSeparator(JsonGenerator.java:719)
	at 	at net.logstash.logback.composite.AbstractCompositeJsonFormatter.decorateGenerator(AbstractCompositeJsonFormatter.java:312)
	at 	at net.logstash.logback.composite.AbstractCompositeJsonFormatter.createGenerator(AbstractCompositeJsonFormatter.java:283)
	at 	at net.logstash.logback.composite.AbstractCompositeJsonFormatter.createJsonFormatter(AbstractCompositeJsonFormatter.java:169)
	at 	at net.logstash.logback.util.ThreadLocalHolder.createInstance(ThreadLocalHolder.java:231)
	at 	at net.logstash.logback.util.ThreadLocalHolder.acquire(ThreadLocalHolder.java:106)
	at 	at net.logstash.logback.composite.AbstractCompositeJsonFormatter.writeEvent(AbstractCompositeJsonFormatter.java:155)
	at 	at net.logstash.logback.encoder.CompositeJsonEncoder.encode(CompositeJsonEncoder.java:106)
	at 	at net.logstash.logback.encoder.CompositeJsonEncoder.encode(CompositeJsonEncoder.java:92)
	at 	at net.logstash.logback.encoder.CompositeJsonEncoder.encode(CompositeJsonEncoder.java:36)
	at 	at ch.qos.logback.core.OutputStreamAppender.subAppend(OutputStreamAppender.java:230)
	at 	at ch.qos.logback.core.OutputStreamAppender.append(OutputStreamAppender.java:102)
	at 	at ch.qos.logback.core.UnsynchronizedAppenderBase.doAppend(UnsynchronizedAppenderBase.java:84)
	at 	at ch.qos.logback.core.spi.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:51)
	at 	at ch.qos.logback.classic.Logger.appendLoopOnAppenders(Logger.java:270)
	at 	at ch.qos.logback.classic.Logger.callAppenders(Logger.java:257)
	at 	at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:421)
	at 	at ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.java:383)
	at 	at ch.qos.logback.classic.Logger.log(Logger.java:765)
	at 	at org.apache.commons.logging.LogAdapter$Slf4jLocationAwareLog.info(LogAdapter.java:454)
...

Thank you for finding the bug cause.

I've spent quite a lot of day to find it, but wasn't aware of
<statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" /> feature and was digging everywhere a little but finally found nothing. :)