728x90
코드 적용
: Configuration 클래스 하나 안에서 일괄 작성하는 방식과 Formatter 클래스를 따로두는 방식 두가지로 작성
: 각 방식에 따라 결과로 출력되는 포맷이 다르게 적용되어 있다.
1. 한줄 SQL 로그 + 처리 결과 출력 : 아래의 ConFig 클래스 안에서 해결
package TeamBigDipper.UYouBooDan.global.p6spy;
import com.p6spy.engine.logging.Category;
import com.p6spy.engine.spy.appender.MessageFormattingStrategy;
import org.hibernate.engine.jdbc.internal.FormatStyle;
import java.util.Locale;
public class P6spySqlFormatConfig implements MessageFormattingStrategy {
@Override
public String formatMessage (int connectionId, String now, long elapsed, String category, String prepared, String sql, String url) {
sql = formatSql(category, sql);
return "|P6Spy sql|" + category + "|" +sql;
}
private String formatSql(String category, String sql) {
if (sql == null || sql.trim().equals("")) return sql;
if (Category.STATEMENT.getName().equals(category)) {
String tmpsql = sql.trim().toLowerCase(Locale.ROOT); // <== 언어설정?
if (tmpsql.startsWith("create") || tmpsql.startsWith("alter") || tmpsql.startsWith("comment")) {
sql = FormatStyle.DDL.getFormatter().format(sql);
}
else {
sql = FormatStyle.BASIC.getFormatter().format(sql);
}
}
return sql;
}
}
2. SQL 로그 + 처리속도 + 처리 결과 출력
1) Config 클래스 : P6spyPrettySqlFormatter클래스 구현 후 적용하는 방식
package TeamBigDipper.UYouBooDan.global.p6spy;
import com.p6spy.engine.spy.P6SpyOptions;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
/**
* p6spy 커스터마이징을 적용하기 위한 클래스
*/
@Configuration
public class P6spyLogMessageFormatConfiguration {
@PostConstruct
public void setLogMessageFormat() {
P6SpyOptions.getActiveInstance().setLogMessageFormat(P6spyPrettySqlFormatter.class.getName());
}
}
2) 포매터 클래스 (커스터마이징 하는 클래스)
package TeamBigDipper.UYouBooDan.global.p6spy;
import com.p6spy.engine.logging.Category;
import com.p6spy.engine.spy.appender.MessageFormattingStrategy;
import org.hibernate.engine.jdbc.internal.FormatStyle;
import java.util.Locale;
import java.util.Stack;
/**
* p6spy를 커스터마이징하기 위한 포맷터 클래스
*/
public class P6spyPrettySqlFormatter implements MessageFormattingStrategy {
@Override
public String formatMessage(final int connectionId, final String now, final long elapsed, final String category,
final String prepared, final String sql, final String url) {
Stack<String> callStack = new Stack<>();
StackTraceElement[] stackTrace = new Throwable().getStackTrace();
for (int i = 0; i < stackTrace.length; i++) {
String trace = stackTrace.toString();
if (trace.startsWith("io.p6spy") && !trace.contains("P6spyPrettySqlFormatter")) {
callStack.push(trace);
}
}
StringBuilder callStackBuilder = new StringBuilder();
int order = 1;
while (callStack.size() != 0) {
callStackBuilder.append("\n\t\t" + (order++) + ". " + callStack.pop());
}
String message = new StringBuilder()
.append("\n\n\tConnection ID: ")
.append(connectionId)
.append("\n\tExecution Time: ")
.append(elapsed)
.append(" ms\n")
.append("\n\tCall Stack (number 1 is entry point): ")
.append(callStackBuilder).append("\n")
.append("\n----------------------------------------------------------------------------------------------------")
.toString();
return sqlFormat(sql, category, message);
}
private String sqlFormat(String sql, String category, String message) {
if (sql.trim() == null || sql.trim().isEmpty()) {
return "";
}
// 로깅 전략 선택 (RESULT 등)
if (Category.RESULT.getName().equals(category)) {
String s = sql.trim().toLowerCase(Locale.ROOT); // 언어 설정 (ENGLISH 등)
if (s.startsWith("create") || s.startsWith("alter") || s.startsWith("comment")) {
// sql 전략 선태 (NONE, DDL, BASIC 등)
sql = FormatStyle.DDL.getFormatter().format(sql);
} else {
sql = FormatStyle.DDL.getFormatter().format(sql);
}
}
return new StringBuilder().append("\n").append(sql.toUpperCase()).append(message).toString();
}
}
레퍼런스
참고링크 : https://jessyt.tistory.com/27
참고링크 : https://okky.kr/articles/955689
728x90
'Java & Spring > Spring' 카테고리의 다른 글
| [OAuth2.0] 네이버(Naver) 로그인 - SpringBoot JPA JWT 방식용 (0) | 2023.05.07 |
|---|---|
| [Redis] (5) EC2에 Redis 적용하기 - Ubuntu 사용 (0) | 2023.02.15 |
| [JPQL] JPQL | Native Query 작성하기 (0) | 2023.02.15 |
| [Redis] (4) 도커 없이 Redis 적용하기 - Ubuntu 사용 (0) | 2023.02.14 |
| [Redis] (3) Redis로 로그아웃 (Access 및 Refresh Token 관리) (0) | 2023.02.11 |