From 50dc84e682ae662511a09bee427e46a66a245f40 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Thu, 13 Aug 2026 05:16:13 +0200 Subject: [PATCH 1/2] feat(core): Warn for legacy Logs configuration Keep parsing the nullable logs.enabled external option and emit tailored migration warnings for explicit true and false values without changing manual Logs capture. Co-Authored-By: Claude --- .../main/java/io/sentry/SentryOptions.java | 15 ++++ .../java/io/sentry/ExternalOptionsTest.kt | 12 ++++ .../test/java/io/sentry/SentryOptionsTest.kt | 72 +++++++++++++++++++ 3 files changed, 99 insertions(+) diff --git a/sentry/src/main/java/io/sentry/SentryOptions.java b/sentry/src/main/java/io/sentry/SentryOptions.java index 16748005af2..aa136d176aa 100644 --- a/sentry/src/main/java/io/sentry/SentryOptions.java +++ b/sentry/src/main/java/io/sentry/SentryOptions.java @@ -3733,6 +3733,21 @@ public void merge(final @NotNull ExternalOptions options) { } } + if (options.isEnableLogs() != null) { + if (options.isEnableLogs()) { + logger.log( + SentryLevel.WARNING, + "The 'logs.enabled' option is no longer supported. Manual Sentry.logger() calls no " + + "longer require it, and automatic logging integrations now require their own " + + "opt-ins."); + } else { + logger.log( + SentryLevel.WARNING, + "The 'logs.enabled' option no longer disables manual Sentry.logger() calls. Automatic " + + "logging integrations remain disabled unless enabled through their own opt-ins."); + } + } + if (options.isEnableMetrics() != null) { getMetrics().setEnabled(options.isEnableMetrics()); } diff --git a/sentry/src/test/java/io/sentry/ExternalOptionsTest.kt b/sentry/src/test/java/io/sentry/ExternalOptionsTest.kt index fee707d31f3..5288264c068 100644 --- a/sentry/src/test/java/io/sentry/ExternalOptionsTest.kt +++ b/sentry/src/test/java/io/sentry/ExternalOptionsTest.kt @@ -437,6 +437,18 @@ class ExternalOptionsTest { withPropertiesFile("logs.enabled=true") { options -> assertTrue(options.isEnableLogs == true) } } + @Test + fun `creates options with enableLogs set to false`() { + withPropertiesFile("logs.enabled=false") { options -> + assertTrue(options.isEnableLogs == false) + } + } + + @Test + fun `creates options with enableLogs set to null when not set`() { + withPropertiesFile { assertNull(it.isEnableLogs) } + } + @Test fun `creates options with enableMetrics set to true`() { withPropertiesFile("metrics.enabled=true") { options -> diff --git a/sentry/src/test/java/io/sentry/SentryOptionsTest.kt b/sentry/src/test/java/io/sentry/SentryOptionsTest.kt index 29df56a1669..17546c62136 100644 --- a/sentry/src/test/java/io/sentry/SentryOptionsTest.kt +++ b/sentry/src/test/java/io/sentry/SentryOptionsTest.kt @@ -2,6 +2,9 @@ package io.sentry import io.sentry.SentryOptions.RequestSize import io.sentry.logger.ILoggerBatchProcessorFactory +import io.sentry.logger.LoggerApi +import io.sentry.test.createSentryClientMock +import io.sentry.test.createTestScopes import io.sentry.util.StringUtils import java.io.File import java.net.Proxy @@ -15,8 +18,11 @@ import kotlin.test.assertNotNull import kotlin.test.assertNull import kotlin.test.assertSame import kotlin.test.assertTrue +import org.mockito.kotlin.any +import org.mockito.kotlin.anyOrNull import org.mockito.kotlin.eq import org.mockito.kotlin.mock +import org.mockito.kotlin.never import org.mockito.kotlin.verify class SentryOptionsTest { @@ -501,6 +507,72 @@ class SentryOptionsTest { assertTrue(options.metrics.isEnabled) } + @Test + fun `merging options does not warn when legacy logs configuration is absent`() { + val logger = mock() + val options = + SentryOptions().also { + it.isDebug = true + it.setLogger(logger) + } + + options.merge(ExternalOptions()) + + verify(logger, never()).log(eq(SentryLevel.WARNING), any()) + } + + @Test + fun `merging options warns when legacy logs configuration is true`() { + val logger = mock() + val options = + SentryOptions().also { + it.isDebug = true + it.setLogger(logger) + } + + options.merge(ExternalOptions().apply { isEnableLogs = true }) + + verify(logger) + .log( + SentryLevel.WARNING, + "The 'logs.enabled' option is no longer supported. Manual Sentry.logger() calls no " + + "longer require it, and automatic logging integrations now require their own opt-ins.", + *emptyArray(), + ) + assertLegacyLogsConfigurationDoesNotDisableCapture(options) + } + + @Test + fun `merging options warns when legacy logs configuration is false`() { + val logger = mock() + val options = + SentryOptions().also { + it.isDebug = true + it.setLogger(logger) + } + + options.merge(ExternalOptions().apply { isEnableLogs = false }) + + verify(logger) + .log( + SentryLevel.WARNING, + "The 'logs.enabled' option no longer disables manual Sentry.logger() calls. Automatic " + + "logging integrations remain disabled unless enabled through their own opt-ins.", + *emptyArray(), + ) + assertLegacyLogsConfigurationDoesNotDisableCapture(options) + } + + private fun assertLegacyLogsConfigurationDoesNotDisableCapture(options: SentryOptions) { + options.dsn = "https://key@sentry.io/proj" + val client = createSentryClientMock() + val scopes = createTestScopes(options).apply { bindClient(client) } + + LoggerApi(scopes).info("test log") + + verify(client).captureLog(any(), anyOrNull()) + } + @Test fun `merging options merges and overwrites existing tag values`() { val externalOptions = ExternalOptions() From 95e50e260a9ea4041143f5b7370a71bddf4cdc5c Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Wed, 30 Sep 2026 10:40:13 +0200 Subject: [PATCH 2/2] ref(core): Remove legacy Logs configuration warnings Drop the warning-only behavior so the PR is neutral before removal from the v9 stack. Co-Authored-By: Claude --- .../main/java/io/sentry/SentryOptions.java | 15 ---- .../test/java/io/sentry/SentryOptionsTest.kt | 72 ------------------- 2 files changed, 87 deletions(-) diff --git a/sentry/src/main/java/io/sentry/SentryOptions.java b/sentry/src/main/java/io/sentry/SentryOptions.java index 13edbd390e4..adb35d35ba8 100644 --- a/sentry/src/main/java/io/sentry/SentryOptions.java +++ b/sentry/src/main/java/io/sentry/SentryOptions.java @@ -3834,21 +3834,6 @@ public void merge(final @NotNull ExternalOptions options) { } } - if (options.isEnableLogs() != null) { - if (options.isEnableLogs()) { - logger.log( - SentryLevel.WARNING, - "The 'logs.enabled' option is no longer supported. Manual Sentry.logger() calls no " - + "longer require it, and automatic logging integrations now require their own " - + "opt-ins."); - } else { - logger.log( - SentryLevel.WARNING, - "The 'logs.enabled' option no longer disables manual Sentry.logger() calls. Automatic " - + "logging integrations remain disabled unless enabled through their own opt-ins."); - } - } - if (options.isEnableMetrics() != null) { getMetrics().setEnabled(options.isEnableMetrics()); } diff --git a/sentry/src/test/java/io/sentry/SentryOptionsTest.kt b/sentry/src/test/java/io/sentry/SentryOptionsTest.kt index 58b9fbada23..ac16dc7e941 100644 --- a/sentry/src/test/java/io/sentry/SentryOptionsTest.kt +++ b/sentry/src/test/java/io/sentry/SentryOptionsTest.kt @@ -3,9 +3,6 @@ package io.sentry import com.google.common.truth.Truth.assertThat import io.sentry.SentryOptions.RequestSize import io.sentry.logger.ILoggerBatchProcessorFactory -import io.sentry.logger.LoggerApi -import io.sentry.test.createSentryClientMock -import io.sentry.test.createTestScopes import io.sentry.util.StringUtils import java.io.File import java.net.Proxy @@ -19,11 +16,8 @@ import kotlin.test.assertNotNull import kotlin.test.assertNull import kotlin.test.assertSame import kotlin.test.assertTrue -import org.mockito.kotlin.any -import org.mockito.kotlin.anyOrNull import org.mockito.kotlin.eq import org.mockito.kotlin.mock -import org.mockito.kotlin.never import org.mockito.kotlin.verify class SentryOptionsTest { @@ -670,72 +664,6 @@ class SentryOptionsTest { assertTrue(options.metrics.isEnabled) } - @Test - fun `merging options does not warn when legacy logs configuration is absent`() { - val logger = mock() - val options = - SentryOptions().also { - it.isDebug = true - it.setLogger(logger) - } - - options.merge(ExternalOptions()) - - verify(logger, never()).log(eq(SentryLevel.WARNING), any()) - } - - @Test - fun `merging options warns when legacy logs configuration is true`() { - val logger = mock() - val options = - SentryOptions().also { - it.isDebug = true - it.setLogger(logger) - } - - options.merge(ExternalOptions().apply { isEnableLogs = true }) - - verify(logger) - .log( - SentryLevel.WARNING, - "The 'logs.enabled' option is no longer supported. Manual Sentry.logger() calls no " + - "longer require it, and automatic logging integrations now require their own opt-ins.", - *emptyArray(), - ) - assertLegacyLogsConfigurationDoesNotDisableCapture(options) - } - - @Test - fun `merging options warns when legacy logs configuration is false`() { - val logger = mock() - val options = - SentryOptions().also { - it.isDebug = true - it.setLogger(logger) - } - - options.merge(ExternalOptions().apply { isEnableLogs = false }) - - verify(logger) - .log( - SentryLevel.WARNING, - "The 'logs.enabled' option no longer disables manual Sentry.logger() calls. Automatic " + - "logging integrations remain disabled unless enabled through their own opt-ins.", - *emptyArray(), - ) - assertLegacyLogsConfigurationDoesNotDisableCapture(options) - } - - private fun assertLegacyLogsConfigurationDoesNotDisableCapture(options: SentryOptions) { - options.dsn = "https://key@sentry.io/proj" - val client = createSentryClientMock() - val scopes = createTestScopes(options).apply { bindClient(client) } - - LoggerApi(scopes).info("test log") - - verify(client).captureLog(any(), anyOrNull()) - } - @Test fun `merging options merges and overwrites existing tag values`() { val externalOptions = ExternalOptions()