Skip to content

Commit ba9bccc

Browse files
adinauerclaude
andcommitted
ref(timber)!: Require explicit Logs opt-in
Replace the no-argument SentryTimberIntegration constructor with a boolean overload so manually installed integrations must choose whether to forward Sentry Logs. Keep the lazy evaluator path for auto-installed integrations and clarify the separate Android option and constructor configuration paths. BREAKING CHANGE: SentryTimberIntegration() now requires a logsEnabled argument. Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 215754d commit ba9bccc

5 files changed

Lines changed: 61 additions & 35 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@
77
- Add a `logsEnabled` argument to the preferred Log4j2 `SentryAppender` constructor and
88
`createAppender` factory. Pass `true` to opt in to Sentry Logs capture or `false` to keep it
99
disabled. ([#5941](https://github.com/getsentry/sentry-java/pull/5941))
10-
- Add a `logsEnabled` argument to the `SentryTimberIntegration` and `SentryTimberTree` JVM
11-
constructors. It defaults to `false` for Kotlin callers; Java callers using the explicit level
12-
constructors must pass the new argument. ([#5943](https://github.com/getsentry/sentry-java/pull/5943))
10+
- Require a `logsEnabled` argument when manually constructing `SentryTimberIntegration` or
11+
`SentryTimberTree`. Replace `SentryTimberIntegration()` with
12+
`SentryTimberIntegration(logsEnabled = false)` in Kotlin or `new SentryTimberIntegration(false)`
13+
in Java to keep Sentry Logs disabled. ([#5943](https://github.com/getsentry/sentry-java/pull/5943))
1314
- Remove the obsolete aggregate Sentry Metrics options `metrics.enabled` and
1415
`options.getMetrics().setEnabled(...)`. Direct `Sentry.metrics()` calls continue to capture
1516
Metrics whenever the SDK is enabled. ([#5953](https://github.com/getsentry/sentry-java/pull/5953))
@@ -22,7 +23,9 @@
2223
- Log4j2 appender: `logsEnabled`
2324
- JUL handler: `io.sentry.jul.SentryHandler.logsEnabled`
2425
- Spring Boot logging auto-configuration: `sentry.logging.logs-enabled`
25-
- Timber: `timberLogCaptureEnabled` or `io.sentry.timber.logs.enabled` manifest metadata
26+
- Auto-installed Timber integration: `timberLogCaptureEnabled` or
27+
`io.sentry.timber.logs.enabled` manifest metadata
28+
- Manually installed Timber integration: `logsEnabled` constructor argument
2629
- Logcat: `logcatLogCaptureEnabled` or `io.sentry.logcat.logs.enabled` manifest metadata
2730

2831
### Features

‎sentry-android-core/src/test/java/io/sentry/android/core/SentryAndroidTest.kt‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,13 @@ class SentryAndroidTest {
286286
fixture.initSut(autoInit = true) {
287287
it.addIntegration(FragmentLifecycleIntegration(ApplicationProvider.getApplicationContext()))
288288

289-
it.addIntegration(SentryTimberIntegration(minEventLevel = FATAL, minBreadcrumbLevel = DEBUG))
289+
it.addIntegration(
290+
SentryTimberIntegration(
291+
minEventLevel = FATAL,
292+
minBreadcrumbLevel = DEBUG,
293+
logsEnabled = false,
294+
)
295+
)
290296

291297
it.addIntegration(
292298
SystemEventsBreadcrumbsIntegration(

‎sentry-android-timber/api/sentry-android-timber.api‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ public final class io/sentry/android/timber/BuildConfig {
88
}
99

1010
public final class io/sentry/android/timber/SentryTimberIntegration : io/sentry/Integration, java/io/Closeable {
11-
public fun <init> ()V
1211
public fun <init> (Lio/sentry/SentryLevel;Lio/sentry/SentryLevel;Lio/sentry/SentryLogLevel;Z)V
1312
public synthetic fun <init> (Lio/sentry/SentryLevel;Lio/sentry/SentryLevel;Lio/sentry/SentryLogLevel;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V
13+
public fun <init> (Z)V
1414
public fun close ()V
1515
public final fun getLogsEnabled ()Z
1616
public final fun getMinBreadcrumbLevel ()Lio/sentry/SentryLevel;

‎sentry-android-timber/src/main/java/io/sentry/android/timber/SentryTimberIntegration.kt‎

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,45 @@ import java.io.Closeable
1414
import timber.log.Timber
1515

1616
/** Sentry integration for Timber. */
17-
public class SentryTimberIntegration(
18-
public val minEventLevel: SentryLevel = SentryLevel.ERROR,
19-
public val minBreadcrumbLevel: SentryLevel = SentryLevel.INFO,
20-
public val minLogsLevel: SentryLogLevel = SentryLogLevel.INFO,
21-
logsEnabled: Boolean = false,
17+
public class SentryTimberIntegration
18+
private constructor(
19+
public val minEventLevel: SentryLevel,
20+
public val minBreadcrumbLevel: SentryLevel,
21+
public val minLogsLevel: SentryLogLevel,
22+
private val logsEnabledProvider: Evaluator<Boolean>,
2223
) : Integration, Closeable {
23-
public val logsEnabled: Boolean
24-
get() = logsEnabledProvider.evaluate()
24+
public constructor(
25+
minEventLevel: SentryLevel = SentryLevel.ERROR,
26+
minBreadcrumbLevel: SentryLevel = SentryLevel.INFO,
27+
minLogsLevel: SentryLogLevel = SentryLogLevel.INFO,
28+
logsEnabled: Boolean,
29+
) : this(
30+
minEventLevel,
31+
minBreadcrumbLevel,
32+
minLogsLevel,
33+
Evaluator { logsEnabled },
34+
)
2535

26-
private var logsEnabledProvider: Evaluator<Boolean> = Evaluator { logsEnabled }
36+
public constructor(
37+
logsEnabled: Boolean
38+
) : this(
39+
SentryLevel.ERROR,
40+
SentryLevel.INFO,
41+
SentryLogLevel.INFO,
42+
logsEnabled,
43+
)
2744

28-
internal constructor(logsEnabledProvider: Evaluator<Boolean>) : this() {
29-
this.logsEnabledProvider = logsEnabledProvider
30-
}
45+
internal constructor(
46+
logsEnabledProvider: Evaluator<Boolean>
47+
) : this(
48+
SentryLevel.ERROR,
49+
SentryLevel.INFO,
50+
SentryLogLevel.INFO,
51+
logsEnabledProvider,
52+
)
53+
54+
public val logsEnabled: Boolean
55+
get() = logsEnabledProvider.evaluate()
3156

3257
private lateinit var tree: SentryTimberTree
3358
private lateinit var logger: ILogger

‎sentry-android-timber/src/test/java/io/sentry/android/timber/SentryTimberIntegrationTest.kt‎

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -39,22 +39,14 @@ class SentryTimberIntegrationTest {
3939
minEventLevel: SentryLevel = SentryLevel.ERROR,
4040
minBreadcrumbLevel: SentryLevel = SentryLevel.INFO,
4141
minLogsLevel: SentryLogLevel = SentryLogLevel.INFO,
42-
logsEnabled: Boolean? = null,
42+
logsEnabled: Boolean = false,
4343
): SentryTimberIntegration =
44-
if (logsEnabled == null) {
45-
SentryTimberIntegration(
46-
minEventLevel = minEventLevel,
47-
minBreadcrumbLevel = minBreadcrumbLevel,
48-
minLogsLevel = minLogsLevel,
49-
)
50-
} else {
51-
SentryTimberIntegration(
52-
minEventLevel = minEventLevel,
53-
minBreadcrumbLevel = minBreadcrumbLevel,
54-
minLogsLevel = minLogsLevel,
55-
logsEnabled = logsEnabled,
56-
)
57-
}
44+
SentryTimberIntegration(
45+
minEventLevel = minEventLevel,
46+
minBreadcrumbLevel = minBreadcrumbLevel,
47+
minLogsLevel = minLogsLevel,
48+
logsEnabled = logsEnabled,
49+
)
5850
}
5951

6052
private val fixture = Fixture()
@@ -86,8 +78,8 @@ class SentryTimberIntegrationTest {
8678
}
8779

8880
@Test
89-
fun `Manual integration defaults logs to disabled while capturing events and breadcrumbs`() {
90-
val sut = fixture.getSut()
81+
fun `Manual integration keeps logs disabled when configured false`() {
82+
val sut = SentryTimberIntegration(logsEnabled = false)
9183
sut.register(fixture.scopes, fixture.options)
9284

9385
assertFalse(sut.logsEnabled)
@@ -100,7 +92,7 @@ class SentryTimberIntegrationTest {
10092

10193
@Test
10294
fun `Manual integration captures logs when enabled`() {
103-
val sut = fixture.getSut(logsEnabled = true)
95+
val sut = SentryTimberIntegration(logsEnabled = true)
10496
sut.register(fixture.scopes, fixture.options)
10597

10698
assertTrue(sut.logsEnabled)

0 commit comments

Comments
 (0)