Skip to content

Commit 660cb10

Browse files
patch: Fix log splitting not showing logs with Marker (#146)
1 parent 5fd42a1 commit 660cb10

3 files changed

Lines changed: 130 additions & 18 deletions

File tree

platform-spring-bom/platform-spring-logging-server-config/src/main/java/com/latch/LengthSplittingAppender.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,13 @@
3434
* SOFTWARE.
3535
*/
3636
public class LengthSplittingAppender extends SplittingAppenderBase<ILoggingEvent> {
37+
private final LoggingEventCloner loggingEventCloner;
38+
39+
public LengthSplittingAppender() {
40+
super();
41+
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
42+
this.loggingEventCloner = new LoggingEventCloner(loggerContext);
43+
}
3744

3845
private int maxLength;
3946
private String sequenceKey;
@@ -61,19 +68,17 @@ public boolean shouldSplit(ILoggingEvent event) {
6168

6269
@Override
6370
public List<ILoggingEvent> split(ILoggingEvent event) {
64-
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
6571
List<String> logMessages = splitString(event.getFormattedMessage(), getMaxLength());
6672

6773
List<ILoggingEvent> splitLogEvents = new ArrayList<>(logMessages.size());
6874
for (int i = 0; i < logMessages.size(); i++) {
69-
70-
LoggingEvent partition = LoggingEventCloner.clone(event, loggerContext);
75+
String message = logMessages.get(i);
7176
Map<String, String> seqMDCPropertyMap = new HashMap<>(event.getMDCPropertyMap());
7277
seqMDCPropertyMap.put(getSequenceKey(), Integer.toString(i));
73-
partition.setMDCPropertyMap(seqMDCPropertyMap);
74-
partition.setMessage(logMessages.get(i));
7578

76-
splitLogEvents.add(partition);
79+
LoggingEvent clonedEvent = loggingEventCloner.clone(event, message, seqMDCPropertyMap);
80+
81+
splitLogEvents.add(clonedEvent);
7782
}
7883

7984
return splitLogEvents;
@@ -85,7 +90,7 @@ private List<String> splitString(String str, int chunkSize) {
8590

8691
List<String> results = new ArrayList<>(remainder == 0 ? fullChunks : fullChunks + 1);
8792
for (int i = 0; i < fullChunks; i++) {
88-
results.add(str.substring(i*chunkSize, i*chunkSize + chunkSize));
93+
results.add(str.substring(i * chunkSize, i * chunkSize + chunkSize));
8994
}
9095
if (remainder != 0) {
9196
results.add(str.substring(str.length() - remainder));

platform-spring-bom/platform-spring-logging-server-config/src/main/java/com/latch/LoggingEventCloner.java

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.slf4j.Marker;
77

88
import java.util.List;
9+
import java.util.Map;
910

1011
/*
1112
* MIT License
@@ -31,26 +32,33 @@
3132
* SOFTWARE.
3233
*/
3334
class LoggingEventCloner {
35+
private final LoggerContext loggerContext;
3436

35-
static LoggingEvent clone(ILoggingEvent event, LoggerContext loggerContext) {
36-
LoggingEvent logEventPartition = new LoggingEvent();
37+
public LoggingEventCloner(LoggerContext loggerContext) {
38+
this.loggerContext = loggerContext;
39+
}
40+
41+
public LoggingEvent clone(ILoggingEvent event, String message, Map<String, String> mdcValueMap) {
42+
LoggingEvent newEvent = new LoggingEvent();
3743

38-
logEventPartition.setLevel(event.getLevel());
39-
logEventPartition.setLoggerName(event.getLoggerName());
40-
logEventPartition.setTimeStamp(event.getTimeStamp());
41-
logEventPartition.setLoggerContextRemoteView(event.getLoggerContextVO());
42-
logEventPartition.setLoggerContext(loggerContext);
43-
logEventPartition.setThreadName(event.getThreadName());
44+
newEvent.setLevel(event.getLevel());
45+
newEvent.setLoggerName(event.getLoggerName());
46+
newEvent.setTimeStamp(event.getTimeStamp());
47+
newEvent.setLoggerContextRemoteView(event.getLoggerContextVO());
48+
newEvent.setLoggerContext(this.loggerContext);
49+
newEvent.setThreadName(event.getThreadName());
50+
newEvent.setMessage(message);
51+
newEvent.setMDCPropertyMap(mdcValueMap);
4452

4553
List<Marker> eventMarkers = event.getMarkerList();
4654
if (eventMarkers != null && !eventMarkers.isEmpty()) {
47-
logEventPartition.getMarkerList().addAll(eventMarkers);
55+
eventMarkers.forEach(newEvent::addMarker);
4856
}
4957

5058
if (event.hasCallerData()) {
51-
logEventPartition.setCallerData(event.getCallerData());
59+
newEvent.setCallerData(event.getCallerData());
5260
}
5361

54-
return logEventPartition;
62+
return newEvent;
5563
}
5664
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package com.latch;
2+
3+
import ch.qos.logback.classic.Level;
4+
import ch.qos.logback.classic.LoggerContext;
5+
import ch.qos.logback.classic.spi.LoggingEvent;
6+
import org.junit.jupiter.api.Assertions;
7+
import org.junit.jupiter.api.Test;
8+
import org.slf4j.LoggerFactory;
9+
import org.slf4j.Marker;
10+
import org.slf4j.helpers.BasicMarkerFactory;
11+
12+
import java.util.Collections;
13+
import java.util.Map;
14+
15+
public class LoggingEventClonerTest {
16+
private final LoggerContext loggerContext;
17+
private final LoggingEventCloner loggingEventCloner;
18+
19+
public LoggingEventClonerTest() {
20+
this.loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
21+
this.loggingEventCloner = new LoggingEventCloner(loggerContext);
22+
}
23+
24+
@Test
25+
public void correctlyClonesBasicEventProperties() {
26+
LoggingEvent event = createLoggingEventWithContext();
27+
event.setLevel(Level.DEBUG);
28+
event.setLoggerName("loggerName");
29+
event.setThreadName("testThread");
30+
event.setTimeStamp(System.currentTimeMillis());
31+
32+
LoggingEvent clonedEvent = loggingEventCloner.clone(event, "", Collections.emptyMap());
33+
34+
Assertions.assertNotNull(clonedEvent);
35+
Assertions.assertEquals(event.getLevel(), clonedEvent.getLevel());
36+
Assertions.assertEquals(event.getLoggerName(), clonedEvent.getLoggerName());
37+
Assertions.assertEquals(event.getThreadName(), clonedEvent.getThreadName());
38+
Assertions.assertEquals(event.getTimeStamp(), clonedEvent.getTimeStamp());
39+
}
40+
41+
@Test
42+
public void correctlyClonesMessage() {
43+
LoggingEvent event = createLoggingEventWithContext();
44+
String message = "Test message";
45+
46+
LoggingEvent clonedEvent = loggingEventCloner.clone(event, message, Collections.emptyMap());
47+
48+
Assertions.assertNotNull(clonedEvent);
49+
Assertions.assertEquals(message, clonedEvent.getMessage());
50+
}
51+
52+
@Test
53+
public void correctlyClonesMDCProperties() {
54+
LoggingEvent event = createLoggingEventWithContext();
55+
Map<String, String> mdcProperties = Map.of("key1", "value1", "key2", "value2");
56+
57+
LoggingEvent clonedEvent = loggingEventCloner.clone(event, "", mdcProperties);
58+
59+
Assertions.assertNotNull(clonedEvent);
60+
Map<String, String> clonedMDCProperties = clonedEvent.getMDCPropertyMap();
61+
Assertions.assertEquals(2, clonedMDCProperties.size());
62+
Assertions.assertEquals("value1", clonedMDCProperties.get("key1"));
63+
Assertions.assertEquals("value2", clonedMDCProperties.get("key2"));
64+
}
65+
66+
@Test
67+
public void correctlyClonesMarker() {
68+
LoggingEvent event = createLoggingEventWithContext();
69+
Marker marker = new BasicMarkerFactory().getMarker("TestMarker");
70+
event.addMarker(marker);
71+
72+
LoggingEvent clonedEvent = loggingEventCloner.clone(event, "", Collections.emptyMap());
73+
74+
Assertions.assertNotNull(clonedEvent);
75+
Assertions.assertEquals(marker.getName(), clonedEvent.getMarkerList().get(0).getName());
76+
}
77+
78+
@Test
79+
public void correctlyClonesCallerData() {
80+
LoggingEvent event = createLoggingEventWithContext();
81+
StackTraceElement[] callerData = new StackTraceElement[] {
82+
new StackTraceElement("com.example.Class", "method", "Class.java", 42)
83+
};
84+
event.setCallerData(callerData);
85+
86+
LoggingEvent clonedEvent = loggingEventCloner.clone(event, "", Collections.emptyMap());
87+
88+
Assertions.assertTrue(clonedEvent.hasCallerData());
89+
StackTraceElement[] clonedCallerData = clonedEvent.getCallerData();
90+
Assertions.assertEquals(1, clonedCallerData.length);
91+
Assertions.assertEquals(callerData[0].getClassLoaderName(), clonedCallerData[0].getClassLoaderName());
92+
}
93+
94+
private LoggingEvent createLoggingEventWithContext() {
95+
LoggingEvent event = new LoggingEvent();
96+
event.setLoggerContext(loggerContext);
97+
return event;
98+
}
99+
}

0 commit comments

Comments
 (0)