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