bestsource

스프링 데이터 R2DBC에 쿼리 매개 변수의 값을 기록하시겠습니까?

bestsource 2023. 3. 15. 19:47
반응형

스프링 데이터 R2DBC에 쿼리 매개 변수의 값을 기록하시겠습니까?

Spring Data R2DBC에서는 다음을 사용하여 SQL 쿼리를 기록할 수 있습니다.

logging.level.org.springframework.data.r2dbc=DEBUG

에서application.properties.

그러나 쿼리 매개 변수로 바인딩된 실제 값은 기록되지 않습니다.

스프링 데이터 R2DBC에 쿼리 파라미터의 실제 값을 기록하려면 어떻게 해야 합니까?

이것은 나에게 효과가 있었다:

 logging:
  level:
    io.r2dbc.postgresql.QUERY: DEBUG # for queries
    io.r2dbc.postgresql.PARAM: DEBUG # for parameters

여기서 찾았어

h2 및 기타 DB의 경우 다음을 수행합니다.

logging.level.io.r2dbc.h2=TRACE

MySQL을 사용하는 경우 드라이버 로그 수준을 다음과 같이 설정하면 데이터베이스 서버와의 모든 통신에 대한 낮은 수준의 네트워크 덤프를 얻을 수 있습니다.TRACE.

logging.level.ROOT=TRACE
logging.level.dev.miku.r2dbc.mysql.client.ReactorNettyClient=TRACE

출력 예:

19-11-2020 00:03:28.072 TRACE [reactor-tcp-nio-2] d.m.r.mysql.client.ReactorNettyClient - [id: 0x9cf29125, L:/127.0.0.1:63807 - R:localhost/127.0.0.1:33306] READ: 71B
         +-------------------------------------------------+
         |  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f |
+--------+-------------------------------------------------+----------------+
|00000000| 01 00 00 01 01 1b 00 00 02 03 64 65 66 00 00 00 |..........def...|
|00000010| 05 4e 4f 57 28 29 00 0c 3f 00 13 00 00 00 0c 81 |.NOW()..?.......|
|00000020| 00 00 00 00 14 00 00 03 13 32 30 32 30 2d 31 31 |.........2020-11|
|00000030| 2d 31 39 20 30 31 3a 30 33 3a 32 38 07 00 00 04 |-19 01:03:28....|
|00000040| fe 00 00 02 00 00 00                            |.......         |
+--------+-------------------------------------------------+----------------+

SpringBoot v2.7.5에서 다음을 수행합니다.

logging.level.org.springframework.r2dbc=TRACE
logging.level.org.springframework.r2dbc=DEBUG

mysql r2dbc의 sql 문을 기록하기 위해 소스 코드를 갱신해야 합니다.이것은 나의 접근법입니다.

  Index: src/main/java/dev/miku/r2dbc/mysql/message/client/TextQueryMessage.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/src/main/java/dev/miku/r2dbc/mysql/message/client/TextQueryMessage.java b/src/main/java/dev/miku/r2dbc/mysql/message/client/TextQueryMessage.java
--- a/src/main/java/dev/miku/r2dbc/mysql/message/client/TextQueryMessage.java   (revision bdba9eebe79976aa4bb75aa0aad25c7cbbdf4dec)
+++ b/src/main/java/dev/miku/r2dbc/mysql/message/client/TextQueryMessage.java   (revision 1b5e0133cc8d43bfc32133912d9e3589374ae75a)
@@ -20,6 +20,8 @@
 import dev.miku.r2dbc.mysql.Parameter;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import reactor.core.publisher.Mono;
 
 import java.nio.charset.Charset;
@@ -42,6 +44,8 @@
 
     private final Consumer<String> sqlProceed;
 
+    private static final Logger logger = LoggerFactory.getLogger(TextQueryMessage.class);
+
     public TextQueryMessage(List<String> sqlParts, Parameter[] values, Consumer<String> sqlProceed) {
         requireNonNull(sqlParts, "sql parts must not be null");
         requireNonNull(values, "values must not be null");
@@ -64,6 +68,10 @@
         try {
             Charset charset = context.getClientCollation().getCharset();
             return ParamWriter.publish(sqlParts, values).map(sql -> {
+
+                if(logger.isDebugEnabled()){
+                    logger.debug("parametered sql statement[{}]",sql);
+                }
                 sqlProceed.accept(sql);
 
                 ByteBuf buf = allocator.buffer(sql.length(), Integer.MAX_VALUE);

그런 다음 logback-spring.xml의 TextQueryMessage 로그 수준을 변경합니다.

<logger name="dev.miku.r2dbc.mysql.message.client.TextQueryMessage" level="DEBUG" additivity="false">
    <appender-ref ref="async_file"/>
</logger>

언급URL : https://stackoverflow.com/questions/60972914/log-values-of-query-parameters-in-spring-data-r2dbc

반응형