Skip to content

Commit cf17b6c

Browse files
authored
Merge 540d9e7 into 85d7417
2 parents 85d7417 + 540d9e7 commit cf17b6c

File tree

5 files changed

+122
-9
lines changed

5 files changed

+122
-9
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## Unreleased
44

5+
### Fixes
6+
7+
- Only set log template for logging integrations if formatted message differs from template ([#4682](https://github.com/getsentry/sentry-java/pull/4682))
8+
59
### Features
610

711
- Add support for Spring Boot 4 and Spring 7 ([#4601](https://github.com/getsentry/sentry-java/pull/4601))

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,9 +154,19 @@ protected void captureLog(@NotNull LogRecord loggingEvent) {
154154
message = loggingEvent.getResourceBundle().getString(loggingEvent.getMessage());
155155
}
156156

157-
attributes.add(SentryAttribute.stringAttribute("sentry.message.template", message));
157+
String formattedMessage = null;
158+
boolean formattingFailed = false;
159+
try {
160+
formattedMessage = maybeFormatted(arguments, message);
161+
} catch (RuntimeException e) {
162+
formattedMessage = message;
163+
formattingFailed = true;
164+
}
165+
166+
if (formattingFailed || !formattedMessage.equals(message)) {
167+
attributes.add(SentryAttribute.stringAttribute("sentry.message.template", message));
168+
}
158169

159-
final @NotNull String formattedMessage = maybeFormatted(arguments, message);
160170
final @NotNull SentryLogParameters params = SentryLogParameters.create(attributes);
161171
params.setOrigin("auto.log.jul");
162172

@@ -170,6 +180,7 @@ protected void captureLog(@NotNull LogRecord loggingEvent) {
170180
return formatMessage(message, arguments);
171181
} catch (RuntimeException e) {
172182
// local formatting failed, sending raw message instead of formatted message
183+
throw e;
173184
}
174185
}
175186

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

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class SentryHandlerTest {
3535
val configureWithLogManager: Boolean = false,
3636
val transport: ITransport = mock(),
3737
contextTags: List<String>? = null,
38+
printfStyle: Boolean = true,
3839
) {
3940
var logger: Logger
4041
var handler: SentryHandler
@@ -49,6 +50,7 @@ class SentryHandlerTest {
4950
handler.setMinimumBreadcrumbLevel(minimumBreadcrumbLevel)
5051
handler.setMinimumEventLevel(minimumEventLevel)
5152
handler.setMinimumLevel(minimumLevel)
53+
handler.setPrintfStyle(printfStyle)
5254
handler.level = Level.ALL
5355
logger.handlers.forEach { logger.removeHandler(it) }
5456
logger.addHandler(handler)
@@ -476,4 +478,94 @@ class SentryHandlerTest {
476478
verify(fixture.transport)
477479
.send(checkLogs { event -> assertEquals(SentryLogLevel.ERROR, event.items.first().level) })
478480
}
481+
482+
@Test
483+
fun `does not set template on log when logging message without parameters`() {
484+
fixture = Fixture(minimumLevel = Level.SEVERE)
485+
fixture.logger.severe("testing message without parameters")
486+
487+
Sentry.flush(1000)
488+
489+
verify(fixture.transport)
490+
.send(
491+
checkLogs { logs ->
492+
val log = logs.items.first()
493+
assertEquals("testing message without parameters", log.body)
494+
assertNull(log.attributes?.get("sentry.message.template"))
495+
}
496+
)
497+
}
498+
499+
@Test
500+
fun `sets template on log when logging message with parameters`() {
501+
fixture = Fixture(minimumLevel = Level.SEVERE)
502+
fixture.logger.log(Level.SEVERE, "testing message {0}", arrayOf("param"))
503+
504+
Sentry.flush(1000)
505+
506+
verify(fixture.transport)
507+
.send(
508+
checkLogs { logs ->
509+
val log = logs.items.first()
510+
assertEquals("testing message param", log.body)
511+
assertEquals("testing message {0}", log.attributes?.get("sentry.message.template")?.value)
512+
assertEquals("param", log.attributes?.get("sentry.message.parameter.0")?.value)
513+
}
514+
)
515+
}
516+
517+
@Test
518+
fun `sets template on log when logging message with parameters and using printfStyle`() {
519+
fixture = Fixture(minimumLevel = Level.SEVERE, printfStyle = true)
520+
fixture.logger.log(Level.SEVERE, "testing message %s", arrayOf("param"))
521+
522+
Sentry.flush(1000)
523+
524+
verify(fixture.transport)
525+
.send(
526+
checkLogs { logs ->
527+
val log = logs.items.first()
528+
assertEquals("testing message param", log.body)
529+
assertEquals("testing message %s", log.attributes?.get("sentry.message.template")?.value)
530+
assertEquals("param", log.attributes?.get("sentry.message.parameter.0")?.value)
531+
}
532+
)
533+
}
534+
535+
@Test
536+
fun `sets template on log when logging message with parameters and formatting fails`() {
537+
fixture = Fixture(minimumLevel = Level.SEVERE)
538+
fixture.logger.log(Level.SEVERE, "testing message {0} {1}", arrayOf(1))
539+
540+
Sentry.flush(1000)
541+
542+
verify(fixture.transport)
543+
.send(
544+
checkLogs { logs ->
545+
val log = logs.items.first()
546+
assertEquals("testing message {0} {1}", log.body)
547+
assertEquals("testing message {0} {1}", log.attributes?.get("sentry.message.template")?.value)
548+
assertEquals(1, log.attributes?.get("sentry.message.parameter.0")?.value)
549+
assertNull(log.attributes?.get("sentry.message.parameter.1"))
550+
}
551+
)
552+
}
553+
554+
@Test
555+
fun `sets template on log when logging message with parameters and formatting fails due to 0 args`() {
556+
fixture = Fixture(minimumLevel = Level.SEVERE, printfStyle = true)
557+
fixture.logger.log(Level.SEVERE, "testing message %d", emptyArray())
558+
559+
Sentry.flush(1000)
560+
561+
verify(fixture.transport)
562+
.send(
563+
checkLogs { logs ->
564+
val log = logs.items.first()
565+
assertEquals("testing message %d", log.body)
566+
assertEquals("testing message %d", log.attributes?.get("sentry.message.template")?.value)
567+
assertNull(log.attributes?.get("sentry.message.parameter.0"))
568+
}
569+
)
570+
}
479571
}

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -222,11 +222,14 @@ protected void captureLog(@NotNull LogEvent loggingEvent) {
222222
final @Nullable Object[] arguments = loggingEvent.getMessage().getParameters();
223223
final @NotNull SentryAttributes attributes = SentryAttributes.of();
224224

225-
attributes.add(
226-
SentryAttribute.stringAttribute(
227-
"sentry.message.template", loggingEvent.getMessage().getFormat()));
228-
225+
final @Nullable String nonFormattedMessage = loggingEvent.getMessage().getFormat();
229226
final @NotNull String formattedMessage = loggingEvent.getMessage().getFormattedMessage();
227+
228+
if (nonFormattedMessage != null && !formattedMessage.equals(nonFormattedMessage)) {
229+
attributes.add(
230+
SentryAttribute.stringAttribute("sentry.message.template", nonFormattedMessage));
231+
}
232+
230233
final @NotNull SentryLogParameters params = SentryLogParameters.create(attributes);
231234
params.setOrigin("auto.log.log4j2");
232235

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -183,15 +183,18 @@ protected void captureLog(@NotNull ILoggingEvent loggingEvent) {
183183

184184
@Nullable Object[] arguments = null;
185185
final @NotNull SentryAttributes attributes = SentryAttributes.of();
186+
final @NotNull String formattedMessage = formatted(loggingEvent);
186187

187188
// if encoder is set we treat message+params as PII as encoders may be used to mask/strip PII
188189
if (encoder == null || ScopesAdapter.getInstance().getOptions().isSendDefaultPii()) {
189-
attributes.add(
190-
SentryAttribute.stringAttribute("sentry.message.template", loggingEvent.getMessage()));
190+
final @Nullable String nonFormattedMessage = loggingEvent.getMessage();
191+
if (nonFormattedMessage != null && !formattedMessage.equals(nonFormattedMessage)) {
192+
attributes.add(
193+
SentryAttribute.stringAttribute("sentry.message.template", nonFormattedMessage));
194+
}
191195
arguments = loggingEvent.getArgumentArray();
192196
}
193197

194-
final @NotNull String formattedMessage = formatted(loggingEvent);
195198
final @NotNull SentryLogParameters params = SentryLogParameters.create(attributes);
196199
params.setOrigin("auto.log.logback");
197200

0 commit comments

Comments
 (0)