Leonid Bogdanov created LOG4J2-2034:
---------------------------------------
Summary: in async mode JsonLayout can't serialize an event with
self referenced throwable
Key: LOG4J2-2034
URL: https://issues.apache.org/jira/browse/LOG4J2-2034
Project: Log4j 2
Issue Type: Bug
Components: Layouts
Affects Versions: 2.9.0
Reporter: Leonid Bogdanov
When async logging is configured, JsonLayout cannot serialize a log event in
which provided Throwable has a self-reference. Fo example, this may by the case
for many Spring exceptions inherited from
{{org.springframework.core.NestedRuntimeException}} or
{{org.springframework.core.NestedCheckedException}} classes via
{{getMostSpecificCause()}} method.
The root cause of the bug is
{{org.apache.logging.log4j.core.async.RingBufferLogEvent.getThrowable()}}
method, it isn't marked as ignored by Jackson serializer, so when the Throwable
contains a self-reference Jackson blows up with an exception
{code}
2017-09-07 13:28:08,799 Log4j2-TF-1-AsyncLogger[AsyncContext@6bc7c054]-1 ERROR
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Direct
self-reference leading to cycle (through reference chain:
org.apache.logging.log4j.core.async.RingBufferLogEvent["throwable"]->org.log4j.App$SelfReferencedException["mostSpecificCause"])
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Direct
self-reference leading to cycle (through reference chain:
org.apache.logging.log4j.core.async.RingBufferLogEvent["throwable"]->org.log4j.App$SelfReferencedException["mostSpecificCause"])
at
com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77)
at
com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1191)
at
com.fasterxml.jackson.databind.ser.BeanPropertyWriter._handleSelfReference(BeanPropertyWriter.java:944)
at
com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:721)
at
com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:719)
at
com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155)
at
com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:727)
at
com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter.serializeAsField(SimpleBeanPropertyFilter.java:208)
at
com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFieldsFiltered(BeanSerializerBase.java:771)
at
com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:153)
at
com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
at
com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
at
com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1396)
at
com.fasterxml.jackson.databind.ObjectWriter._configAndWriteValue(ObjectWriter.java:1120)
at
com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:966)
at
org.apache.logging.log4j.core.layout.AbstractJacksonLayout.toSerializable(AbstractJacksonLayout.java:213)
at
org.apache.logging.log4j.core.layout.JsonLayout.toSerializable(JsonLayout.java:254)
at
org.apache.logging.log4j.core.layout.AbstractJacksonLayout.toSerializable(AbstractJacksonLayout.java:193)
at
org.apache.logging.log4j.core.layout.JsonLayout.toSerializable(JsonLayout.java:60)
at
org.apache.logging.log4j.core.layout.AbstractJacksonLayout.toSerializable(AbstractJacksonLayout.java:34)
at
org.apache.logging.log4j.core.layout.AbstractStringLayout.toByteArray(AbstractStringLayout.java:299)
at
org.apache.logging.log4j.core.layout.AbstractLayout.encode(AbstractLayout.java:210)
at
org.apache.logging.log4j.core.layout.AbstractLayout.encode(AbstractLayout.java:37)
...
{code}
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)