@@ -6,7 +6,10 @@ import ch.qos.logback.core.read.ListAppender
66import io.sentry.ITransportFactory
77import io.sentry.NoOpTransportFactory
88import io.sentry.ScopesAdapter
9+ import io.sentry.Sentry
10+ import io.sentry.checkLogs
911import io.sentry.log4j2.SentryAppender
12+ import io.sentry.transport.ITransport
1013import kotlin.test.AfterTest
1114import kotlin.test.BeforeTest
1215import kotlin.test.Test
@@ -17,6 +20,11 @@ import org.apache.logging.log4j.core.LoggerContext
1720import org.apache.logging.log4j.core.config.DefaultConfiguration
1821import org.apache.logging.log4j.core.config.LoggerConfig
1922import org.assertj.core.api.Assertions.assertThat
23+ import org.mockito.kotlin.any
24+ import org.mockito.kotlin.mock
25+ import org.mockito.kotlin.never
26+ import org.mockito.kotlin.verify
27+ import org.mockito.kotlin.whenever
2028import org.slf4j.LoggerFactory
2129import org.springframework.boot.autoconfigure.AutoConfigurations
2230import org.springframework.boot.test.context.FilteredClassLoader
@@ -63,6 +71,16 @@ class SentryLog4j2AppenderAutoConfigurationTest {
6371
6472 private val dsnEnabledRunner = dsnOnlyRunner.withPropertyValues(" sentry.logging.enabled=true" )
6573
74+ private val logsRunner =
75+ baseContextRunner
76+ .withLog4j2CoreProvider()
77+ .withPropertyValues(
78+ " sentry.dsn=http://key@localhost/proj" ,
79+ " sentry.logging.enabled=true" ,
80+ " sentry.logs.enabled=true" ,
81+ )
82+ .withUserConfiguration(MockTransportConfiguration ::class .java)
83+
6684 // Hide the Log4j2 Core provider so LogManager uses the Log4j-to-SLF4J bridge.
6785 private val log4j2BridgeDsnEnabledRunner =
6886 baseContextRunner
@@ -181,6 +199,29 @@ class SentryLog4j2AppenderAutoConfigurationTest {
181199 }
182200 }
183201
202+ @Test
203+ fun `forwards Sentry Logs when enabled` () {
204+ logsRunner.withPropertyValues(" sentry.logging.enable-logs=true" ).run {
205+ LogManager .getLogger(" io.sentry.spring.boot.jakarta.logs-enabled" ).error(" enabled log" )
206+ Sentry .flush(1000 )
207+
208+ val transport = it.getBean(ITransport ::class .java)
209+ verify(transport)
210+ .send(checkLogs { logs -> assertThat(logs.items.single().body).isEqualTo(" enabled log" ) })
211+ }
212+ }
213+
214+ @Test
215+ fun `does not forward Sentry Logs by default` () {
216+ logsRunner.run {
217+ LogManager .getLogger(" io.sentry.spring.boot.jakarta.logs-disabled" ).error(" disabled log" )
218+ Sentry .flush(1000 )
219+
220+ val transport = it.getBean(ITransport ::class .java)
221+ verify(transport, never()).send(checkLogs {})
222+ }
223+ }
224+
184225 @Test
185226 fun `does not configure SentryAppender when logging is disabled` () {
186227 dsnEnabledRunner.withPropertyValues(" sentry.logging.enabled=false" ).run {
@@ -251,6 +292,21 @@ class SentryLog4j2AppenderAutoConfigurationTest {
251292 .run { assertThat(rootLogger.getAppenders(SentryAppender ::class .java)).isEmpty() }
252293 }
253294
295+ @Configuration(proxyBeanMethods = false )
296+ open class MockTransportConfiguration {
297+
298+ private val transport = mock<ITransport >()
299+
300+ @Bean
301+ open fun mockTransportFactory (): ITransportFactory {
302+ val factory = mock<ITransportFactory >()
303+ whenever(factory.create(any(), any())).thenReturn(transport)
304+ return factory
305+ }
306+
307+ @Bean open fun sentryTransport () = transport
308+ }
309+
254310 @Configuration(proxyBeanMethods = false )
255311 open class NoOpTransportConfiguration {
256312
0 commit comments