|
29 | 29 | import ch.qos.logback.classic.spi.ILoggingEvent;
|
30 | 30 | import ch.qos.logback.classic.spi.IThrowableProxy;
|
31 | 31 | import ch.qos.logback.classic.spi.ThrowableProxy;
|
| 32 | +import ch.qos.logback.core.Layout; |
32 | 33 | import ch.qos.logback.core.encoder.EncoderBase;
|
33 | 34 | import co.elastic.logging.AdditionalField;
|
34 | 35 | import co.elastic.logging.EcsJsonSerializer;
|
@@ -56,6 +57,7 @@ public class EcsEncoder extends EncoderBase<ILoggingEvent> {
|
56 | 57 | private boolean includeOrigin;
|
57 | 58 | private final List<AdditionalField> additionalFields = new ArrayList<AdditionalField>();
|
58 | 59 | private OutputStream os;
|
| 60 | + protected Layout<ILoggingEvent> messageLayout; |
59 | 61 |
|
60 | 62 | @Override
|
61 | 63 | public byte[] headerBytes() {
|
@@ -105,7 +107,7 @@ public byte[] encode(ILoggingEvent event) {
|
105 | 107 | StringBuilder builder = new StringBuilder(256);
|
106 | 108 | EcsJsonSerializer.serializeObjectStart(builder, event.getTimeStamp());
|
107 | 109 | EcsJsonSerializer.serializeLogLevel(builder, event.getLevel().toString());
|
108 |
| - EcsJsonSerializer.serializeFormattedMessage(builder, event.getFormattedMessage()); |
| 110 | + serializeMessage(event, builder); |
109 | 111 | EcsJsonSerializer.serializeEcsVersion(builder);
|
110 | 112 | serializeMarkers(event, builder);
|
111 | 113 | EcsJsonSerializer.serializeServiceName(builder, serviceName);
|
@@ -140,12 +142,21 @@ public byte[] encode(ILoggingEvent event) {
|
140 | 142 | return builder.toString().getBytes(UTF_8);
|
141 | 143 | }
|
142 | 144 |
|
| 145 | + private void serializeMessage(ILoggingEvent event, StringBuilder builder) { |
| 146 | + if (messageLayout == null) { |
| 147 | + EcsJsonSerializer.serializeFormattedMessage(builder, event.getFormattedMessage()); |
| 148 | + } else { |
| 149 | + EcsJsonSerializer.serializeFormattedMessage(builder, messageLayout.doLayout(event)); |
| 150 | + } |
| 151 | + } |
| 152 | + |
143 | 153 | /**
|
144 | 154 | * Subclasses can override this to add custom fields.
|
145 | 155 | * The last character in the StringBuilder will be comma when this is called.
|
146 | 156 | * You must add a comma after each custom field.
|
147 | 157 | */
|
148 |
| - protected void addCustomFields(ILoggingEvent event, StringBuilder builder) {} |
| 158 | + protected void addCustomFields(ILoggingEvent event, StringBuilder builder) { |
| 159 | + } |
149 | 160 |
|
150 | 161 | private void serializeMarkers(ILoggingEvent event, StringBuilder builder) {
|
151 | 162 | Marker marker = event.getMarker();
|
@@ -210,4 +221,13 @@ public void setEventDataset(String eventDataset) {
|
210 | 221 | public void setThrowableConverter(ThrowableHandlingConverter throwableConverter) {
|
211 | 222 | this.throwableConverter = throwableConverter;
|
212 | 223 | }
|
| 224 | + |
| 225 | + /** |
| 226 | + * The supplied Layout will be applied specifically to format the <code>message</code> field based on the logging event. |
| 227 | + * |
| 228 | + * @param messageLayout |
| 229 | + */ |
| 230 | + public void setMessageLayout(Layout<ILoggingEvent> messageLayout) { |
| 231 | + this.messageLayout = messageLayout; |
| 232 | + } |
213 | 233 | }
|
0 commit comments