From 9d316c9a71576e2a6a5d3f0726de91a6b1773b7c Mon Sep 17 00:00:00 2001 From: Johannes Riegler Date: Thu, 12 Jun 2025 16:57:17 +0200 Subject: [PATCH 1/3] Fix log splitting not showing logs with Marker --- .../com/latch/LengthSplittingAppender.java | 17 +-- .../java/com/latch/LoggingEventCloner.java | 14 ++- .../com/latch/LoggingEventClonerTest.java | 101 ++++++++++++++++++ 3 files changed, 123 insertions(+), 9 deletions(-) create mode 100644 platform-spring-bom/platform-spring-logging-server-config/src/test/java/com/latch/LoggingEventClonerTest.java diff --git a/platform-spring-bom/platform-spring-logging-server-config/src/main/java/com/latch/LengthSplittingAppender.java b/platform-spring-bom/platform-spring-logging-server-config/src/main/java/com/latch/LengthSplittingAppender.java index 18e313b..55a02b7 100644 --- a/platform-spring-bom/platform-spring-logging-server-config/src/main/java/com/latch/LengthSplittingAppender.java +++ b/platform-spring-bom/platform-spring-logging-server-config/src/main/java/com/latch/LengthSplittingAppender.java @@ -34,6 +34,13 @@ * SOFTWARE. */ public class LengthSplittingAppender extends SplittingAppenderBase { + private final LoggingEventCloner loggingEventCloner; + + public LengthSplittingAppender() { + super(); + LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); + this.loggingEventCloner = new LoggingEventCloner(loggerContext); + } private int maxLength; private String sequenceKey; @@ -61,17 +68,15 @@ public boolean shouldSplit(ILoggingEvent event) { @Override public List split(ILoggingEvent event) { - LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); List logMessages = splitString(event.getFormattedMessage(), getMaxLength()); List splitLogEvents = new ArrayList<>(logMessages.size()); for (int i = 0; i < logMessages.size(); i++) { - - LoggingEvent partition = LoggingEventCloner.clone(event, loggerContext); + String message = logMessages.get(i); Map seqMDCPropertyMap = new HashMap<>(event.getMDCPropertyMap()); seqMDCPropertyMap.put(getSequenceKey(), Integer.toString(i)); - partition.setMDCPropertyMap(seqMDCPropertyMap); - partition.setMessage(logMessages.get(i)); + + LoggingEvent partition = loggingEventCloner.clone(event, message, seqMDCPropertyMap); splitLogEvents.add(partition); } @@ -85,7 +90,7 @@ private List splitString(String str, int chunkSize) { List results = new ArrayList<>(remainder == 0 ? fullChunks : fullChunks + 1); for (int i = 0; i < fullChunks; i++) { - results.add(str.substring(i*chunkSize, i*chunkSize + chunkSize)); + results.add(str.substring(i * chunkSize, i * chunkSize + chunkSize)); } if (remainder != 0) { results.add(str.substring(str.length() - remainder)); diff --git a/platform-spring-bom/platform-spring-logging-server-config/src/main/java/com/latch/LoggingEventCloner.java b/platform-spring-bom/platform-spring-logging-server-config/src/main/java/com/latch/LoggingEventCloner.java index 837fa58..d085fb9 100644 --- a/platform-spring-bom/platform-spring-logging-server-config/src/main/java/com/latch/LoggingEventCloner.java +++ b/platform-spring-bom/platform-spring-logging-server-config/src/main/java/com/latch/LoggingEventCloner.java @@ -6,6 +6,7 @@ import org.slf4j.Marker; import java.util.List; +import java.util.Map; /* * MIT License @@ -31,20 +32,27 @@ * SOFTWARE. */ class LoggingEventCloner { + private final LoggerContext loggerContext; - static LoggingEvent clone(ILoggingEvent event, LoggerContext loggerContext) { + public LoggingEventCloner(LoggerContext loggerContext) { + this.loggerContext = loggerContext; + } + + public LoggingEvent clone(ILoggingEvent event, String message, Map mdcValueMap) { LoggingEvent logEventPartition = new LoggingEvent(); logEventPartition.setLevel(event.getLevel()); logEventPartition.setLoggerName(event.getLoggerName()); logEventPartition.setTimeStamp(event.getTimeStamp()); logEventPartition.setLoggerContextRemoteView(event.getLoggerContextVO()); - logEventPartition.setLoggerContext(loggerContext); + logEventPartition.setLoggerContext(this.loggerContext); logEventPartition.setThreadName(event.getThreadName()); + logEventPartition.setMessage(message); + logEventPartition.setMDCPropertyMap(mdcValueMap); List eventMarkers = event.getMarkerList(); if (eventMarkers != null && !eventMarkers.isEmpty()) { - logEventPartition.getMarkerList().addAll(eventMarkers); + eventMarkers.forEach(logEventPartition::addMarker); } if (event.hasCallerData()) { diff --git a/platform-spring-bom/platform-spring-logging-server-config/src/test/java/com/latch/LoggingEventClonerTest.java b/platform-spring-bom/platform-spring-logging-server-config/src/test/java/com/latch/LoggingEventClonerTest.java new file mode 100644 index 0000000..cbc789b --- /dev/null +++ b/platform-spring-bom/platform-spring-logging-server-config/src/test/java/com/latch/LoggingEventClonerTest.java @@ -0,0 +1,101 @@ +package com.latch; + +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.spi.LoggingEvent; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.slf4j.LoggerFactory; +import org.slf4j.Marker; +import org.slf4j.helpers.BasicMarkerFactory; + +import java.util.Collections; +import java.util.Map; + +public class LoggingEventClonerTest { + private final LoggerContext loggerContext; + private final LoggingEventCloner loggingEventCloner; + + public LoggingEventClonerTest() { + this.loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); + this.loggingEventCloner = new LoggingEventCloner(loggerContext); + } + + + + @Test + public void correctlyClonesBasicEventProperties() { + LoggingEvent event = createLoggingEventWithContext(); + event.setLevel(Level.DEBUG); + event.setLoggerName("loggerName"); + event.setThreadName("testThread"); + event.setTimeStamp(System.currentTimeMillis()); + + LoggingEvent clonedEvent = loggingEventCloner.clone(event, "", Collections.emptyMap()); + + Assertions.assertNotNull(clonedEvent); + Assertions.assertEquals(event.getLevel(), clonedEvent.getLevel()); + Assertions.assertEquals(event.getLoggerName(), clonedEvent.getLoggerName()); + Assertions.assertEquals(event.getThreadName(), clonedEvent.getThreadName()); + Assertions.assertEquals(event.getTimeStamp(), clonedEvent.getTimeStamp()); + } + + @Test + public void correctlyClonesMessage() { + LoggingEvent event = createLoggingEventWithContext(); + String message = "Test message"; + + LoggingEvent clonedEvent = loggingEventCloner.clone(event, message, Collections.emptyMap()); + + Assertions.assertNotNull(clonedEvent); + Assertions.assertEquals(message, clonedEvent.getMessage()); + } + + @Test + public void correctlyClonesMDCProperties() { + LoggingEvent event = createLoggingEventWithContext(); + Map mdcProperties = Map.of("key1", "value1", "key2", "value2"); + + LoggingEvent clonedEvent = loggingEventCloner.clone(event, "", mdcProperties); + + Assertions.assertNotNull(clonedEvent); + Map clonedMDCProperties = clonedEvent.getMDCPropertyMap(); + Assertions.assertEquals(2, clonedMDCProperties.size()); + Assertions.assertEquals("value1", clonedMDCProperties.get("key1")); + Assertions.assertEquals("value2", clonedMDCProperties.get("key2")); + } + + @Test + public void correctlyClonesMarker() { + LoggingEvent event = createLoggingEventWithContext(); + Marker marker = new BasicMarkerFactory().getMarker("TestMarker"); + event.addMarker(marker); + + LoggingEvent clonedEvent = loggingEventCloner.clone(event, "", Collections.emptyMap()); + + Assertions.assertNotNull(clonedEvent); + Assertions.assertEquals(marker.getName(), clonedEvent.getMarkerList().get(0).getName()); + } + + @Test + public void correctlyClonesCallerData() { + LoggingEvent event = createLoggingEventWithContext(); + StackTraceElement[] callerData = new StackTraceElement[] { + new StackTraceElement("com.example.Class", "method", "Class.java", 42) + }; + event.setCallerData(callerData); + + LoggingEvent clonedEvent = loggingEventCloner.clone(event, "", Collections.emptyMap()); + + Assertions.assertTrue(clonedEvent.hasCallerData()); + StackTraceElement[] clonedCallerData = clonedEvent.getCallerData(); + Assertions.assertEquals(1, clonedCallerData.length); + Assertions.assertEquals(callerData[0].getClassLoaderName(), clonedCallerData[0].getClassLoaderName()); + } + + private LoggingEvent createLoggingEventWithContext() { + LoggingEvent event = new LoggingEvent(); + event.setLoggerContext(loggerContext); + return event; + } +} From b8c78ffe4cf4dfbca44754fe8e434f38a964e078 Mon Sep 17 00:00:00 2001 From: Johannes Riegler Date: Thu, 12 Jun 2025 17:31:35 +0200 Subject: [PATCH 2/3] rename --- .../com/latch/LengthSplittingAppender.java | 4 ++-- .../java/com/latch/LoggingEventCloner.java | 24 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/platform-spring-bom/platform-spring-logging-server-config/src/main/java/com/latch/LengthSplittingAppender.java b/platform-spring-bom/platform-spring-logging-server-config/src/main/java/com/latch/LengthSplittingAppender.java index 55a02b7..48c196e 100644 --- a/platform-spring-bom/platform-spring-logging-server-config/src/main/java/com/latch/LengthSplittingAppender.java +++ b/platform-spring-bom/platform-spring-logging-server-config/src/main/java/com/latch/LengthSplittingAppender.java @@ -76,9 +76,9 @@ public List split(ILoggingEvent event) { Map seqMDCPropertyMap = new HashMap<>(event.getMDCPropertyMap()); seqMDCPropertyMap.put(getSequenceKey(), Integer.toString(i)); - LoggingEvent partition = loggingEventCloner.clone(event, message, seqMDCPropertyMap); + LoggingEvent clonedEvent = loggingEventCloner.clone(event, message, seqMDCPropertyMap); - splitLogEvents.add(partition); + splitLogEvents.add(clonedEvent); } return splitLogEvents; diff --git a/platform-spring-bom/platform-spring-logging-server-config/src/main/java/com/latch/LoggingEventCloner.java b/platform-spring-bom/platform-spring-logging-server-config/src/main/java/com/latch/LoggingEventCloner.java index d085fb9..670bb5e 100644 --- a/platform-spring-bom/platform-spring-logging-server-config/src/main/java/com/latch/LoggingEventCloner.java +++ b/platform-spring-bom/platform-spring-logging-server-config/src/main/java/com/latch/LoggingEventCloner.java @@ -39,26 +39,26 @@ public LoggingEventCloner(LoggerContext loggerContext) { } public LoggingEvent clone(ILoggingEvent event, String message, Map mdcValueMap) { - LoggingEvent logEventPartition = new LoggingEvent(); + LoggingEvent newEvent = new LoggingEvent(); - logEventPartition.setLevel(event.getLevel()); - logEventPartition.setLoggerName(event.getLoggerName()); - logEventPartition.setTimeStamp(event.getTimeStamp()); - logEventPartition.setLoggerContextRemoteView(event.getLoggerContextVO()); - logEventPartition.setLoggerContext(this.loggerContext); - logEventPartition.setThreadName(event.getThreadName()); - logEventPartition.setMessage(message); - logEventPartition.setMDCPropertyMap(mdcValueMap); + newEvent.setLevel(event.getLevel()); + newEvent.setLoggerName(event.getLoggerName()); + newEvent.setTimeStamp(event.getTimeStamp()); + newEvent.setLoggerContextRemoteView(event.getLoggerContextVO()); + newEvent.setLoggerContext(this.loggerContext); + newEvent.setThreadName(event.getThreadName()); + newEvent.setMessage(message); + newEvent.setMDCPropertyMap(mdcValueMap); List eventMarkers = event.getMarkerList(); if (eventMarkers != null && !eventMarkers.isEmpty()) { - eventMarkers.forEach(logEventPartition::addMarker); + eventMarkers.forEach(newEvent::addMarker); } if (event.hasCallerData()) { - logEventPartition.setCallerData(event.getCallerData()); + newEvent.setCallerData(event.getCallerData()); } - return logEventPartition; + return newEvent; } } From 058d085958aa584ecb62650affbdb0e1f0d05714 Mon Sep 17 00:00:00 2001 From: Johannes Riegler Date: Thu, 12 Jun 2025 17:39:12 +0200 Subject: [PATCH 3/3] chore: remove white lines --- .../src/test/java/com/latch/LoggingEventClonerTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/platform-spring-bom/platform-spring-logging-server-config/src/test/java/com/latch/LoggingEventClonerTest.java b/platform-spring-bom/platform-spring-logging-server-config/src/test/java/com/latch/LoggingEventClonerTest.java index cbc789b..3277102 100644 --- a/platform-spring-bom/platform-spring-logging-server-config/src/test/java/com/latch/LoggingEventClonerTest.java +++ b/platform-spring-bom/platform-spring-logging-server-config/src/test/java/com/latch/LoggingEventClonerTest.java @@ -21,8 +21,6 @@ public LoggingEventClonerTest() { this.loggingEventCloner = new LoggingEventCloner(loggerContext); } - - @Test public void correctlyClonesBasicEventProperties() { LoggingEvent event = createLoggingEventWithContext();