diff --git a/sentry/src/main/java/io/sentry/SentryOptions.java b/sentry/src/main/java/io/sentry/SentryOptions.java index 16748005af..aa136d176a 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 fee707d31f..5288264c06 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 29df56a166..17546c6213 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()