diff --git a/CHANGELOG.md b/CHANGELOG.md index e69d2da9ca9..c5a0d36dedd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Unreleased * Feat: Add option to ignore exceptions by type (#1352) +* Fix: Fix NPE when MDC contains null values (#1364) * Feat: Sentry closes Android NDK and ShutdownHook integrations (#1358) * Fix: Accept only non null value maps (#1368) diff --git a/sentry-logback/src/main/java/io/sentry/logback/SentryAppender.java b/sentry-logback/src/main/java/io/sentry/logback/SentryAppender.java index 1dc24b96be4..200c70cfe0a 100644 --- a/sentry-logback/src/main/java/io/sentry/logback/SentryAppender.java +++ b/sentry-logback/src/main/java/io/sentry/logback/SentryAppender.java @@ -13,7 +13,6 @@ import io.sentry.SentryOptions; import io.sentry.protocol.Message; import io.sentry.protocol.SdkVersion; -import io.sentry.util.CollectionUtils; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -91,8 +90,11 @@ protected void append(@NotNull ILoggingEvent eventObject) { event.setExtra("thread_name", loggingEvent.getThreadName()); } + // remove keys with null values, there is no sense to send these keys to Sentry final Map mdcProperties = - CollectionUtils.shallowCopy(loggingEvent.getMDCPropertyMap()); + loggingEvent.getMDCPropertyMap().entrySet().stream() + .filter(it -> it.getValue() != null) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); if (!mdcProperties.isEmpty()) { event.getContexts().put("MDC", mdcProperties); } diff --git a/sentry-logback/src/test/kotlin/io/sentry/logback/SentryAppenderTest.kt b/sentry-logback/src/test/kotlin/io/sentry/logback/SentryAppenderTest.kt index f8ed059ceb4..a4baadcf951 100644 --- a/sentry-logback/src/test/kotlin/io/sentry/logback/SentryAppenderTest.kt +++ b/sentry-logback/src/test/kotlin/io/sentry/logback/SentryAppenderTest.kt @@ -23,6 +23,7 @@ import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertFalse import kotlin.test.assertNotNull +import kotlin.test.assertNull import kotlin.test.assertTrue import org.awaitility.kotlin.await import org.slf4j.Logger @@ -204,6 +205,20 @@ class SentryAppenderTest { } } + @Test + fun `ignore set tags with null values from MDC`() { + fixture = Fixture(minimumEventLevel = Level.WARN) + MDC.put("key1", null) + MDC.put("key2", null) + fixture.logger.warn("testing MDC tags") + + await.untilAsserted { + verify(fixture.transport).send(checkEvent { event -> + assertNull(event.contexts["MDC"]) + }, anyOrNull()) + } + } + @Test fun `does not create MDC context when no MDC tags are set`() { fixture = Fixture(minimumEventLevel = Level.WARN)