From d96c890dc0e0349f3cb6cc27df27ec796327fae4 Mon Sep 17 00:00:00 2001 From: pricelees Date: Thu, 31 Jul 2025 16:49:02 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=B0=B0=ED=8F=AC=20=ED=99=98=EA=B2=BD?= =?UTF-8?q?=EC=97=90=EC=84=9C=EC=9D=98=20Slow=20Query=20=EB=A1=9C=EA=B9=85?= =?UTF-8?q?=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EC=84=A4=EC=A0=95=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MDCAwareSlowQueryListenerWithoutParams.kt | 29 ++++++++++++ .../common/log/ProxyDataSourceConfig.kt | 46 +++++++++++++++++++ .../log/RoomescapeLogMaskingConverter.kt | 2 +- src/main/resources/application-local.yaml | 3 +- src/main/resources/logback-local.xml | 2 +- 5 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 src/main/kotlin/roomescape/common/log/MDCAwareSlowQueryListenerWithoutParams.kt create mode 100644 src/main/kotlin/roomescape/common/log/ProxyDataSourceConfig.kt diff --git a/src/main/kotlin/roomescape/common/log/MDCAwareSlowQueryListenerWithoutParams.kt b/src/main/kotlin/roomescape/common/log/MDCAwareSlowQueryListenerWithoutParams.kt new file mode 100644 index 00000000..a1084f1e --- /dev/null +++ b/src/main/kotlin/roomescape/common/log/MDCAwareSlowQueryListenerWithoutParams.kt @@ -0,0 +1,29 @@ +package roomescape.common.log + +import net.ttddyy.dsproxy.ExecutionInfo +import net.ttddyy.dsproxy.QueryInfo +import net.ttddyy.dsproxy.listener.logging.SLF4JLogLevel +import net.ttddyy.dsproxy.listener.logging.SLF4JQueryLoggingListener + +class MDCAwareSlowQueryListenerWithoutParams( + private val thresholdMs: Long +) : SLF4JQueryLoggingListener() { + + init { + this.logLevel = SLF4JLogLevel.WARN + } + + override fun afterQuery( + execInfo: ExecutionInfo, + queryInfoList: List + ) { + if (execInfo.elapsedTime >= thresholdMs) { + super.afterQuery(execInfo, queryInfoList) + } + } + + override fun writeLog(message: String) { + val modified = message.replace(Regex("""(,?\s*)Params:\[.*?]"""), "") + super.writeLog(modified) + } +} diff --git a/src/main/kotlin/roomescape/common/log/ProxyDataSourceConfig.kt b/src/main/kotlin/roomescape/common/log/ProxyDataSourceConfig.kt new file mode 100644 index 00000000..4038b3fd --- /dev/null +++ b/src/main/kotlin/roomescape/common/log/ProxyDataSourceConfig.kt @@ -0,0 +1,46 @@ +package roomescape.common.log + +import com.zaxxer.hikari.HikariDataSource +import net.ttddyy.dsproxy.support.ProxyDataSourceBuilder +import org.springframework.beans.factory.annotation.Qualifier +import org.springframework.boot.context.properties.ConfigurationProperties +import org.springframework.boot.context.properties.EnableConfigurationProperties +import org.springframework.boot.jdbc.DataSourceBuilder +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.context.annotation.Primary +import org.springframework.context.annotation.Profile +import javax.sql.DataSource + +@Configuration +@Profile("deploy") +@EnableConfigurationProperties(SlowQueryProperties::class) +class ProxyDataSourceConfig { + + @Bean + @Primary + fun dataSource( + @Qualifier("actualDataSource") actualDataSource: DataSource, + properties: SlowQueryProperties + ): DataSource = ProxyDataSourceBuilder.create(actualDataSource) + .name(properties.loggerName) + .listener( + MDCAwareSlowQueryListenerWithoutParams( + properties.thresholdMs + ) + ) + .buildProxy() + + @Bean + @ConfigurationProperties(prefix = "spring.datasource.hikari") + fun actualDataSource(): DataSource = DataSourceBuilder.create() + .type(HikariDataSource::class.java) + .build() +} + +@Profile("deploy") +@ConfigurationProperties(prefix = "slow-query") +data class SlowQueryProperties( + val loggerName: String, + val thresholdMs: Long, +) diff --git a/src/main/kotlin/roomescape/common/log/RoomescapeLogMaskingConverter.kt b/src/main/kotlin/roomescape/common/log/RoomescapeLogMaskingConverter.kt index 3fb696b1..2c94c436 100644 --- a/src/main/kotlin/roomescape/common/log/RoomescapeLogMaskingConverter.kt +++ b/src/main/kotlin/roomescape/common/log/RoomescapeLogMaskingConverter.kt @@ -36,7 +36,7 @@ class RoomescapeLogMaskingConverter : MessageConverter() { private fun maskedPlainMessage(message: String): String { val keys: String = SENSITIVE_KEYS.joinToString("|") - val regex = Regex("(?i)($keys)(\\s*=\\s*)([^,\\s]+)") + val regex = Regex("(?i)($keys)(\\s*=\\s*)([^(,|\"|?)\\s]+)") return regex.replace(message) { matchResult -> val key = matchResult.groupValues[1] diff --git a/src/main/resources/application-local.yaml b/src/main/resources/application-local.yaml index 9a8b7f2d..52d1151c 100644 --- a/src/main/resources/application-local.yaml +++ b/src/main/resources/application-local.yaml @@ -1,6 +1,5 @@ spring: jpa: - show-sql: false properties: hibernate: format_sql: true @@ -35,7 +34,7 @@ jdbc: query: enable-logging: true log-level: DEBUG - logger-name: query-logger + logger-name: all-query-logger multiline: true includes: connection,query,keys,fetch diff --git a/src/main/resources/logback-local.xml b/src/main/resources/logback-local.xml index fb0a2202..f94aa623 100644 --- a/src/main/resources/logback-local.xml +++ b/src/main/resources/logback-local.xml @@ -20,7 +20,7 @@ - +