Skip to content

Commit

Permalink
[BSVR-55] P6spy를 이용한 쿼리 로그 설정 (#12)
Browse files Browse the repository at this point in the history
* fix : 윈도우에서 makeGitHooksExecutable 에러 fix

* build: p6spy 의존성 추가

* feat: application-jpa에 p6spy 로깅 추가

* feat: query formatter, config 추가

* feat: controller부터 추적되도록 stack trace filter 수정

* feat: 상수명 변경

---------

Co-authored-by: wjdwnsdnjs13 <[email protected]>
  • Loading branch information
EunjiShin and wjdwnsdnjs13 authored Jul 3, 2024
1 parent 24bc4b2 commit f088444
Show file tree
Hide file tree
Showing 6 changed files with 97 additions and 0 deletions.
3 changes: 3 additions & 0 deletions infrastructure/jpa/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ dependencies {
// spring
implementation("org.springframework.boot:spring-boot-starter-data-jpa:_")

// p6spy
implementation("com.github.gavlyukovskiy:p6spy-spring-boot-starter:_")

// h2 - DB (또는 도커) 세팅 후 사라질 예정,,
runtimeOnly("com.h2database:h2")

Expand Down
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package org.depromeet.spot.jpa.common;

import java.util.Locale;

import org.hibernate.engine.jdbc.internal.FormatStyle;
import org.springframework.context.annotation.Configuration;

import com.p6spy.engine.logging.Category;
import com.p6spy.engine.spy.appender.MessageFormattingStrategy;

@Configuration
public class P6spySqlFormatter implements MessageFormattingStrategy {

private static String ROOT_PACKAGE = "org.depromeet.spot";
private static String P6SPY_PACKAGE = "org.depromeet.spot.jpa.common.P6spySqlFormatter";

@Override
public String formatMessage(
int connectionId,
String now,
long elapsed,
String category,
String prepared,
String sql,
String url) {
sql = formatSql(category, sql);
return String.format(
"[%s] | took %d ms | connectionId %d | %s | %s",
category, elapsed, connectionId, filterStack(), formatSql(category, sql));
}

private String formatSql(String category, String sql) {
if (isNotEmpty(sql) && isStatement(category)) {
String trimmedSQL = sql.trim().toLowerCase(Locale.ROOT);
if (isDDL(trimmedSQL)) {
return FormatStyle.DDL.getFormatter().format(sql);
}
return FormatStyle.BASIC.getFormatter().format(sql);
}
return sql;
}

// 일반적인 쿼리인지 판단
// 트랜잭션 커밋, 롤백 등 쿼리가 아닌 작업은 포맷팅하지 않는다.
private boolean isStatement(String category) {
return Category.STATEMENT.getName().equals(category);
}

private boolean isNotEmpty(String sql) {
return sql != null && !sql.trim().isEmpty();
}

private boolean isDDL(String sql) {
return (sql.startsWith("create")) || sql.startsWith("alter") || sql.startsWith("comment");
}

private String filterStack() {
StackTraceElement[] stackTraces = new Throwable().getStackTrace();
StringBuilder sb = new StringBuilder();
int order = 1;

for (StackTraceElement element : stackTraces) {
String trace = element.toString();
if (trace.startsWith(ROOT_PACKAGE) && !trace.contains(P6SPY_PACKAGE)) {
sb.append("\n\t\t").append(order++).append(".").append(trace);
}
}
return sb.toString();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.depromeet.spot.jpa.config;

import jakarta.annotation.PostConstruct;

import org.depromeet.spot.jpa.common.P6spySqlFormatter;
import org.springframework.context.annotation.Configuration;

import com.p6spy.engine.spy.P6SpyOptions;

@Configuration
public class P6spyConfig {

@PostConstruct
public void setLogMessageFormat() {
P6SpyOptions.getActiveInstance().setLogMessageFormat(P6spySqlFormatter.class.getName());
}
}
5 changes: 5 additions & 0 deletions infrastructure/jpa/src/main/resources/application-jpa.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,8 @@ spring:
console:
enabled: true
path: /h2-console

decorator:
datasource:
p6spy:
enable-logging: true
2 changes: 2 additions & 0 deletions versions.properties
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,5 @@ version.org.springframework.boot..spring-boot-starter-data-jpa=3.0.1

version.org.springdoc..springdoc-openapi-starter-webmvc-ui=2.5.0

version.com.github.gavlyukovskiy..p6spy-spring-boot-starter=1.9.0

0 comments on commit f088444

Please sign in to comment.