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
37 public JsonInputStreamLogEventBridge() {
38 this(1024, Charset.defaultCharset());
39 }
40
41 public JsonInputStreamLogEventBridge(final int bufferSize, final Charset charset) {
42 super(new Log4jJsonObjectMapper(), bufferSize, charset, String.valueOf(EVENT_END_MARKER));
43 }
44
45 @Override
46 protected int[] getEventIndices(final String text, final int beginIndex) {
47
48 final int start = text.indexOf(EVENT_START_MARKER, beginIndex);
49 if (start == END) {
50 return END_PAIR;
51 }
52 final char[] charArray = text.toCharArray();
53 int stack = 0;
54 boolean inStr = false;
55 boolean inEsc = false;
56 for (int i = start; i < charArray.length; i++) {
57 final char c = charArray[i];
58 if (!inEsc) {
59 inEsc = false;
60 switch (c) {
61 case EVENT_START_MARKER:
62 if (!inStr) {
63 stack++;
64 }
65 break;
66 case EVENT_END_MARKER:
67 if (!inStr) {
68 stack--;
69 }
70 break;
71 case JSON_STR_DELIM:
72 inStr = !inStr;
73 break;
74 case JSON_ESC:
75 inEsc = true;
76 break;
77 }
78 if (stack == 0) {
79 return new int[] { start, i };
80 }
81 }
82 }
83 return END_PAIR;
84 }
85
86 }