1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.net.server;
18
19 import java.io.InputStream;
20 import java.nio.charset.Charset;
21
22 import org.apache.logging.log4j.core.LogEvent;
23 import org.apache.logging.log4j.core.jackson.Log4jJsonObjectMapper;
24 import org.apache.logging.log4j.util.Chars;
25
26
27
28
29 public class JsonInputStreamLogEventBridge extends InputStreamLogEventBridge {
30
31 private static final int[] END_PAIR = new int[] { END, END };
32 private static final char EVENT_END_MARKER = '}';
33 private static final char EVENT_START_MARKER = '{';
34 private static final char JSON_ESC = '\\';
35 private static final char JSON_STR_DELIM = Chars.DQUOTE;
36 private static final boolean THREAD_CONTEXT_MAP_AS_LIST = false;
37
38 public JsonInputStreamLogEventBridge() {
39 this(1024, Charset.defaultCharset());
40 }
41
42 public JsonInputStreamLogEventBridge(final int bufferSize, final Charset charset) {
43 super(new Log4jJsonObjectMapper(THREAD_CONTEXT_MAP_AS_LIST, true), bufferSize, charset,
44 String.valueOf(EVENT_END_MARKER));
45 }
46
47 @Override
48 protected int[] getEventIndices(final String text, final int beginIndex) {
49
50 final int start = text.indexOf(EVENT_START_MARKER, beginIndex);
51 if (start == END) {
52 return END_PAIR;
53 }
54 final char[] charArray = text.toCharArray();
55 int stack = 0;
56 boolean inStr = false;
57 boolean inEsc = false;
58 for (int i = start; i < charArray.length; i++) {
59 final char c = charArray[i];
60 if (inEsc) {
61
62 inEsc = false;
63 } else {
64 switch (c) {
65 case EVENT_START_MARKER:
66 if (!inStr) {
67 stack++;
68 }
69 break;
70 case EVENT_END_MARKER:
71 if (!inStr) {
72 stack--;
73 }
74 break;
75 case JSON_STR_DELIM:
76 inStr = !inStr;
77 break;
78 case JSON_ESC:
79 inEsc = true;
80 break;
81 }
82 if (stack == 0) {
83 return new int[] { start, i };
84 }
85 }
86 }
87 return END_PAIR;
88 }
89
90 }