Skip to content

Commit f2b0ffb

Browse files
authored
Add origin to logs (#4618)
* Add origin to logs * changelog
1 parent ca4b0e0 commit f2b0ffb

File tree

14 files changed

+88
-16
lines changed

14 files changed

+88
-16
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
- Session Replay: Use main thread looper to schedule replay capture ([#4542](https://github.com/getsentry/sentry-java/pull/4542))
88
- Use single `LifecycleObserver` and multi-cast it to the integrations interested in lifecycle states ([#4567](https://github.com/getsentry/sentry-java/pull/4567))
9+
- Add `sentry.origin` attribute to logs ([#4618](https://github.com/getsentry/sentry-java/pull/4618))
10+
- This helps identify which integration captured a log event
911
- Prewarm `SentryExecutorService` for better performance at runtime ([#4606](https://github.com/getsentry/sentry-java/pull/4606))
1012

1113
### Fixes

sentry-android-core/src/main/java/io/sentry/android/core/SentryLogcatAdapter.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import io.sentry.Sentry;
77
import io.sentry.SentryLevel;
88
import io.sentry.SentryLogLevel;
9+
import io.sentry.logger.SentryLogParameters;
910
import org.jetbrains.annotations.ApiStatus;
1011
import org.jetbrains.annotations.NotNull;
1112
import org.jetbrains.annotations.Nullable;
@@ -56,10 +57,13 @@ private static void addAsLog(
5657
return;
5758
}
5859
final @Nullable String trMessage = tr != null ? tr.getMessage() : null;
60+
final @NotNull SentryLogParameters params = new SentryLogParameters();
61+
params.setOrigin("auto.log.logcat");
62+
5963
if (tr == null || trMessage == null) {
60-
scopes.logger().log(level, msg);
64+
scopes.logger().log(level, params, msg);
6165
} else {
62-
scopes.logger().log(level, msg != null ? (msg + "\n" + trMessage) : trMessage);
66+
scopes.logger().log(level, params, msg != null ? (msg + "\n" + trMessage) : trMessage);
6367
}
6468
}
6569

sentry-android-core/src/test/java/io/sentry/android/core/SentryLogcatAdapterTest.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ class SentryLogcatAdapterTest {
6464
SentryLogcatAdapter.v(tag, "$commonMsg verbose")
6565
fixture.breadcrumbs.first().assert(tag, "$commonMsg verbose", SentryLevel.DEBUG)
6666
fixture.logs.first().assert("$commonMsg verbose", SentryLogLevel.TRACE)
67+
assertEquals("auto.log.logcat", fixture.logs.first().attributes?.get("sentry.origin")?.value)
6768
}
6869

6970
@Test

sentry-android-timber/src/main/java/io/sentry/android/timber/SentryTimberTree.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import io.sentry.IScopes
66
import io.sentry.SentryEvent
77
import io.sentry.SentryLevel
88
import io.sentry.SentryLogLevel
9+
import io.sentry.logger.SentryLogParameters
910
import io.sentry.protocol.Message
1011
import timber.log.Timber
1112

@@ -244,12 +245,15 @@ public class SentryTimberTree(
244245
) {
245246
// checks the log level
246247
if (isLoggable(sentryLogLevel, minLogLevel)) {
248+
val params = SentryLogParameters()
249+
params.origin = "auto.log.timber"
250+
247251
val throwableMsg = throwable?.message
248252
when {
249253
msg != null && throwableMsg != null ->
250-
scopes.logger().log(sentryLogLevel, "$msg\n$throwableMsg", *args)
251-
msg != null -> scopes.logger().log(sentryLogLevel, msg, *args)
252-
throwableMsg != null -> scopes.logger().log(sentryLogLevel, throwableMsg, *args)
254+
scopes.logger().log(sentryLogLevel, params, "$msg\n$throwableMsg", *args)
255+
msg != null -> scopes.logger().log(sentryLogLevel, params, msg, *args)
256+
throwableMsg != null -> scopes.logger().log(sentryLogLevel, params, throwableMsg, *args)
253257
}
254258
}
255259
}

sentry-android-timber/src/test/java/io/sentry/android/timber/SentryTimberTreeTest.kt

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import io.sentry.Scopes
55
import io.sentry.SentryLevel
66
import io.sentry.SentryLogLevel
77
import io.sentry.logger.ILoggerApi
8+
import io.sentry.logger.SentryLogParameters
89
import kotlin.test.BeforeTest
910
import kotlin.test.Test
1011
import kotlin.test.assertEquals
@@ -248,21 +249,28 @@ class SentryTimberTreeTest {
248249
val sut = fixture.getSut()
249250
sut.e("test count: %d %d", 32, 5)
250251

251-
verify(fixture.logs).log(eq(SentryLogLevel.ERROR), eq("test count: %d %d"), eq(32), eq(5))
252+
verify(fixture.logs)
253+
.log(
254+
eq(SentryLogLevel.ERROR),
255+
check<SentryLogParameters> { assertEquals("auto.log.timber", it.origin) },
256+
eq("test count: %d %d"),
257+
eq(32),
258+
eq(5),
259+
)
252260
}
253261

254262
@Test
255263
fun `Tree adds a log if min level is equal`() {
256264
val sut = fixture.getSut()
257265
sut.i(Throwable("test"))
258-
verify(fixture.logs).log(any(), any())
266+
verify(fixture.logs).log(any(), any<SentryLogParameters>(), any<String>())
259267
}
260268

261269
@Test
262270
fun `Tree adds a log if min level is higher`() {
263271
val sut = fixture.getSut()
264272
sut.e(Throwable("test"))
265-
verify(fixture.logs).log(any(), any<String>(), any())
273+
verify(fixture.logs).log(any(), any<SentryLogParameters>(), any<String>(), any())
266274
}
267275

268276
@Test
@@ -277,15 +285,25 @@ class SentryTimberTreeTest {
277285
val sut = fixture.getSut()
278286
sut.i("message")
279287

280-
verify(fixture.logs).log(eq(SentryLogLevel.INFO), eq("message"))
288+
verify(fixture.logs)
289+
.log(
290+
eq(SentryLogLevel.INFO),
291+
check<SentryLogParameters> { assertEquals("auto.log.timber", it.origin) },
292+
eq("message"),
293+
)
281294
}
282295

283296
@Test
284297
fun `Tree adds an error log`() {
285298
val sut = fixture.getSut()
286299
sut.e(Throwable("test"))
287300

288-
verify(fixture.logs).log(eq(SentryLogLevel.ERROR), eq("test"))
301+
verify(fixture.logs)
302+
.log(
303+
eq(SentryLogLevel.ERROR),
304+
check<SentryLogParameters> { assertEquals("auto.log.timber", it.origin) },
305+
eq("test"),
306+
)
289307
}
290308

291309
@Test
@@ -300,14 +318,24 @@ class SentryTimberTreeTest {
300318
val sut = fixture.getSut()
301319
sut.e(Throwable("throwable message"))
302320

303-
verify(fixture.logs).log(eq(SentryLogLevel.ERROR), eq("throwable message"))
321+
verify(fixture.logs)
322+
.log(
323+
eq(SentryLogLevel.ERROR),
324+
check<SentryLogParameters> { assertEquals("auto.log.timber", it.origin) },
325+
eq("throwable message"),
326+
)
304327
}
305328

306329
@Test
307330
fun `Tree logs throwable and message`() {
308331
val sut = fixture.getSut()
309332
sut.e(Throwable("throwable message"), "My message")
310333

311-
verify(fixture.logs).log(eq(SentryLogLevel.ERROR), eq("My message\nthrowable message"))
334+
verify(fixture.logs)
335+
.log(
336+
eq(SentryLogLevel.ERROR),
337+
check<SentryLogParameters> { assertEquals("auto.log.timber", it.origin) },
338+
eq("My message\nthrowable message"),
339+
)
312340
}
313341
}

sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ protected void captureLog(@NotNull LogRecord loggingEvent) {
158158

159159
final @NotNull String formattedMessage = maybeFormatted(arguments, message);
160160
final @NotNull SentryLogParameters params = SentryLogParameters.create(attributes);
161+
params.setOrigin("auto.log.jul");
161162

162163
Sentry.logger().log(sentryLevel, params, formattedMessage, arguments);
163164
}

sentry-jul/src/test/kotlin/io/sentry/jul/SentryHandlerTest.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,12 @@ class SentryHandlerTest {
414414
Sentry.flush(1000)
415415

416416
verify(fixture.transport)
417-
.send(checkLogs { event -> assertEquals(SentryLogLevel.TRACE, event.items.first().level) })
417+
.send(
418+
checkLogs { event ->
419+
assertEquals(SentryLogLevel.TRACE, event.items.first().level)
420+
assertEquals("auto.log.jul", event.items.first().attributes?.get("sentry.origin")?.value)
421+
}
422+
)
418423
}
419424

420425
@Test

sentry-log4j2/src/main/java/io/sentry/log4j2/SentryAppender.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,7 @@ protected void captureLog(@NotNull LogEvent loggingEvent) {
228228

229229
final @NotNull String formattedMessage = loggingEvent.getMessage().getFormattedMessage();
230230
final @NotNull SentryLogParameters params = SentryLogParameters.create(attributes);
231+
params.setOrigin("auto.log.log4j2");
231232

232233
Sentry.logger().log(sentryLevel, params, formattedMessage, arguments);
233234
}

sentry-log4j2/src/test/kotlin/io/sentry/log4j2/SentryAppenderTest.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,15 @@ class SentryAppenderTest {
251251
Sentry.flush(1000)
252252

253253
verify(fixture.transport)
254-
.send(checkLogs { event -> assertEquals(SentryLogLevel.TRACE, event.items.first().level) })
254+
.send(
255+
checkLogs { event ->
256+
assertEquals(SentryLogLevel.TRACE, event.items.first().level)
257+
assertEquals(
258+
"auto.log.log4j2",
259+
event.items.first().attributes?.get("sentry.origin")?.value,
260+
)
261+
}
262+
)
255263
}
256264

257265
@Test

sentry-logback/src/main/java/io/sentry/logback/SentryAppender.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ protected void captureLog(@NotNull ILoggingEvent loggingEvent) {
193193

194194
final @NotNull String formattedMessage = formatted(loggingEvent);
195195
final @NotNull SentryLogParameters params = SentryLogParameters.create(attributes);
196+
params.setOrigin("auto.log.logback");
196197

197198
Sentry.logger().log(sentryLevel, params, formattedMessage, arguments);
198199
}

0 commit comments

Comments
 (0)