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
60 inEsc = false;
61 } else {
62 switch (c) {
63 case EVENT_START_MARKER:
64 if (!inStr) {
65 stack++;
66 }
67 break;
68 case EVENT_END_MARKER:
69 if (!inStr) {
70 stack--;
71 }
72 break;
73 case JSON_STR_DELIM:
74 inStr = !inStr;
75 break;
76 case JSON_ESC:
77 inEsc = true;
78 break;
79 }
80 if (stack == 0) {
81 return new int[] { start, i };
82 }
83 }
84 }
85 return END_PAIR;
86 }
87
88 }