39
39
import org .apache .logging .log4j .core .layout .AbstractStringLayout ;
40
40
import org .apache .logging .log4j .core .layout .ByteBufferDestination ;
41
41
import org .apache .logging .log4j .core .layout .Encoder ;
42
+ import org .apache .logging .log4j .core .layout .PatternLayout ;
42
43
import org .apache .logging .log4j .core .lookup .StrSubstitutor ;
44
+ import org .apache .logging .log4j .core .pattern .PatternFormatter ;
43
45
import org .apache .logging .log4j .core .util .KeyValuePair ;
44
46
import org .apache .logging .log4j .message .Message ;
45
47
import org .apache .logging .log4j .message .MultiformatMessage ;
@@ -78,6 +80,7 @@ public void accept(final String key, final Object value, final StringBuilder str
78
80
};
79
81
80
82
private final KeyValuePair [] additionalFields ;
83
+ private final PatternFormatter [][] fieldValuePatternFormatter ;
81
84
private final Set <String > topLevelLabels ;
82
85
private final boolean stackTraceAsArray ;
83
86
private String serviceName ;
@@ -93,6 +96,15 @@ private EcsLayout(Configuration config, String serviceName, boolean includeMarke
93
96
this .topLevelLabels .add ("trace.id" );
94
97
this .topLevelLabels .add ("transaction.id" );
95
98
this .additionalFields = additionalFields ;
99
+ fieldValuePatternFormatter = new PatternFormatter [additionalFields .length ][];
100
+ for (int i = 0 ; i < additionalFields .length ; i ++) {
101
+ KeyValuePair additionalField = additionalFields [i ];
102
+ if (additionalField .getValue ().contains ("%" )) {
103
+ fieldValuePatternFormatter [i ] = PatternLayout .createPatternParser (config )
104
+ .parse (additionalField .getValue ())
105
+ .toArray (new PatternFormatter [0 ]);
106
+ }
107
+ }
96
108
}
97
109
98
110
@ PluginBuilderFactory
@@ -132,12 +144,21 @@ private StringBuilder toText(LogEvent event, StringBuilder builder, boolean gcFr
132
144
}
133
145
134
146
private void serializeLabels (LogEvent event , StringBuilder builder ) {
135
- if (!event .getContextData ().isEmpty () || additionalFields .length > 0 ) {
136
- if (additionalFields .length > 0 ) {
147
+ final int length = additionalFields .length ;
148
+ if (!event .getContextData ().isEmpty () || length > 0 ) {
149
+ if (length > 0 ) {
137
150
final StrSubstitutor strSubstitutor = getConfiguration ().getStrSubstitutor ();
138
- for (KeyValuePair additionalField : additionalFields ) {
151
+ for (int i = 0 ; i < length ; i ++) {
152
+ KeyValuePair additionalField = additionalFields [i ];
153
+ PatternFormatter [] formatters = fieldValuePatternFormatter [i ];
139
154
CharSequence value = null ;
140
- if (valueNeedsLookup (additionalField .getValue ())) {
155
+ if (formatters != null ) {
156
+ StringBuilder buffer = EcsJsonSerializer .getMessageStringBuilder ();
157
+ formatPattern (event , formatters , buffer );
158
+ if (buffer .length () > 0 ) {
159
+ value = buffer ;
160
+ }
161
+ } else if (valueNeedsLookup (additionalField .getValue ())) {
141
162
StringBuilder lookupValue = EcsJsonSerializer .getMessageStringBuilder ();
142
163
lookupValue .append (additionalField .getValue ());
143
164
if (strSubstitutor .replaceIn (event , lookupValue )) {
@@ -160,6 +181,13 @@ private void serializeLabels(LogEvent event, StringBuilder builder) {
160
181
}
161
182
}
162
183
184
+ private static void formatPattern (LogEvent event , PatternFormatter [] formatters , StringBuilder buffer ) {
185
+ final int len = formatters .length ;
186
+ for (int i = 0 ; i < len ; i ++) {
187
+ formatters [i ].format (event , buffer );
188
+ }
189
+ }
190
+
163
191
private void serializeTags (LogEvent event , StringBuilder builder ) {
164
192
List <String > contextStack = event .getContextStack ().asList ();
165
193
Marker marker = event .getMarker ();
@@ -169,7 +197,8 @@ private void serializeTags(LogEvent event, StringBuilder builder) {
169
197
}
170
198
171
199
if (!contextStack .isEmpty ()) {
172
- for (int i = 0 ; i < contextStack .size (); i ++) {
200
+ final int len = contextStack .size ();
201
+ for (int i = 0 ; i < len ; i ++) {
173
202
builder .append ('\"' );
174
203
JsonUtils .quoteAsString (contextStack .get (i ), builder );
175
204
builder .append ("\" ," );
0 commit comments