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.IOException;
20 import java.io.InputStream;
21 import java.nio.charset.Charset;
22
23 import org.apache.logging.log4j.core.LogEvent;
24 import org.apache.logging.log4j.core.LogEventListener;
25 import org.apache.logging.log4j.core.impl.Log4jLogEvent;
26 import org.apache.logging.log4j.util.Strings;
27
28 import com.fasterxml.jackson.databind.ObjectMapper;
29 import com.fasterxml.jackson.databind.ObjectReader;
30
31
32
33
34 public abstract class InputStreamLogEventBridge extends AbstractLogEventBridge<InputStream> {
35
36 private final int bufferSize;
37
38 private final Charset charset;
39
40 private final String eventEndMarker;
41
42 private final ObjectReader objectReader;
43
44 public InputStreamLogEventBridge(final ObjectMapper mapper, final int bufferSize, final Charset charset, final String eventEndMarker) {
45 this.bufferSize = bufferSize;
46 this.charset = charset;
47 this.eventEndMarker = eventEndMarker;
48 this.objectReader = mapper.readerFor(Log4jLogEvent.class);
49 }
50
51 abstract protected int[] getEventIndices(final String text, int beginIndex);
52
53 @Override
54 public void logEvents(final InputStream inputStream, final LogEventListener logEventListener) throws IOException {
55 String workingText = Strings.EMPTY;
56 try {
57
58 final byte[] buffer = new byte[bufferSize];
59 String textRemains = workingText = Strings.EMPTY;
60 while (true) {
61
62 final int streamReadLength = inputStream.read(buffer);
63 if (streamReadLength == END) {
64
65 break;
66 }
67 final String text = workingText = textRemains + new String(buffer, 0, streamReadLength, charset);
68 int beginIndex = 0;
69 while (true) {
70
71 final int[] pair = getEventIndices(text, beginIndex);
72 final int eventStartMarkerIndex = pair[0];
73 if (eventStartMarkerIndex < 0) {
74
75
76 textRemains = text.substring(beginIndex);
77 break;
78 }
79 final int eventEndMarkerIndex = pair[1];
80 if (eventEndMarkerIndex > 0) {
81 final int eventEndXmlIndex = eventEndMarkerIndex + eventEndMarker.length();
82 final String textEvent = workingText = text.substring(eventStartMarkerIndex, eventEndXmlIndex);
83 final LogEvent logEvent = unmarshal(textEvent);
84 logEventListener.log(logEvent);
85 beginIndex = eventEndXmlIndex;
86 } else {
87
88
89 textRemains = text.substring(beginIndex);
90 break;
91 }
92 }
93 }
94 } catch (final IOException ex) {
95 logger.error(workingText, ex);
96 }
97 }
98
99 protected Log4jLogEvent unmarshal(final String jsonEvent) throws IOException {
100 return this.objectReader.readValue(jsonEvent);
101 }
102
103 }