diff --git a/logback-ecs-encoder/src/main/java/co/elastic/logging/logback/EcsEncoder.java b/logback-ecs-encoder/src/main/java/co/elastic/logging/logback/EcsEncoder.java index a35b3061..ea48e9ed 100644 --- a/logback-ecs-encoder/src/main/java/co/elastic/logging/logback/EcsEncoder.java +++ b/logback-ecs-encoder/src/main/java/co/elastic/logging/logback/EcsEncoder.java @@ -29,6 +29,7 @@ import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.classic.spi.IThrowableProxy; import ch.qos.logback.classic.spi.ThrowableProxy; +import ch.qos.logback.core.Layout; import ch.qos.logback.core.encoder.EncoderBase; import co.elastic.logging.AdditionalField; import co.elastic.logging.EcsJsonSerializer; @@ -54,6 +55,7 @@ public class EcsEncoder extends EncoderBase { private boolean includeOrigin; private final List additionalFields = new ArrayList(); private OutputStream os; + protected Layout layout; @Override public byte[] headerBytes() { @@ -103,7 +105,7 @@ public byte[] encode(ILoggingEvent event) { StringBuilder builder = new StringBuilder(256); EcsJsonSerializer.serializeObjectStart(builder, event.getTimeStamp()); EcsJsonSerializer.serializeLogLevel(builder, event.getLevel().toString()); - EcsJsonSerializer.serializeFormattedMessage(builder, event.getFormattedMessage()); + serializeMessage(event, builder); EcsJsonSerializer.serializeEcsVersion(builder); serializeMarkers(event, builder); EcsJsonSerializer.serializeServiceName(builder, serviceName); @@ -136,6 +138,14 @@ public byte[] encode(ILoggingEvent event) { return builder.toString().getBytes(UTF_8); } + private void serializeMessage(ILoggingEvent event, StringBuilder builder) { + if(layout == null) { + EcsJsonSerializer.serializeFormattedMessage(builder, event.getFormattedMessage()); + } else { + EcsJsonSerializer.serializeFormattedMessage(builder, this.layout.doLayout(event)); + } + } + /** * Subclasses can override this to add custom fields. * The last character in the StringBuilder will be comma when this is called. @@ -198,4 +208,11 @@ public void setEventDataset(String eventDataset) { public void setThrowableConverter(ThrowableHandlingConverter throwableConverter) { this.throwableConverter = throwableConverter; } + public Layout getLayout() { + return this.layout; + } + + public void setLayout(Layout layout) { + this.layout = layout; + } }