반응형
P6Spy: Java 기반 애플리케이션에서 SQL 쿼리의 로깅 및 모니터링을 위한 프레임워크
P6Spy 주요 기능:
- SQL 로깅: 애플리케이션에서 실행되는 모든 SQL 쿼리, 매개변수, 실행 시간을 기록합니다.
- 성능 모니터링: 각 쿼리의 실행 시간을 보여주어 느린 쿼리를 식별하는 데 도움을 줍니다.
- 동적 필터링: SELECT, UPDATE 등의 특정 쿼리 유형을 필터링하여 로그에서 제외할 수 있습니다.
- 간편한 사용: 표준 JDBC 드라이버 대신 P6Spy 드라이버를 사용하여 SQL 쿼리를 감시하고 로깅합니다.
동작 방식:
- 스파이 드라이버: P6SpyDriver가 실제 JDBC 드라이버를 감싸고 모든 SQL 쿼리를 가로챕니다.
- 로그 기록: 쿼리를 콘솔 또는 파일로 기록하며, 로그 포맷은 커스터마이징 가능합니다.
- 분석: 로그를 통해 느린 쿼리를 찾아 성능을 최적화하거나, SQL 관련 문제를 디버깅할 수 있습니다.
implementation("p6spy:p6spy:3.9.1")
spring.datasource.url=jdbc:p6spy:mysql://10.162.5.x:3306/your_database_name
spring.datasource.driver-class-name=com.p6spy.engine.spy.P6SpyDriver
with springboot 3.2.5
################################################################################################
# P6Spy Options File #
# See documentation for detailed instructions #
# https://p6spy.readthedocs.io/en/latest/configandusage.html#configuration-and-usage #
################################################################################################
appender=com.p6spy.engine.spy.appender.Slf4JLogger
logMessageFormat=com.p6spy.engine.spy.appender.CustomLineFormat
customLogMessageFormat=| %(executionTime) ms | %(sql)
databaseDialectDateFormat=yyyy-MM-dd'T'HH:mm:ss
databaseDialectTimestampFormat=yyyy-MM-dd'T'HH:mm:ss
resources/spy.properties 에 위와 같은 내용 작성
import com.p6spy.engine.logging.Category;
import com.p6spy.engine.spy.P6SpyOptions;
import com.p6spy.engine.spy.appender.MessageFormattingStrategy;
import jakarta.annotation.PostConstruct;
import java.util.Locale;
import org.hibernate.engine.jdbc.internal.FormatStyle;
import org.springframework.context.annotation.Configuration;
@Configuration
public class P6SpyConfig implements MessageFormattingStrategy {
@PostConstruct
public void setLogMessageFormat() {
P6SpyOptions.getActiveInstance().setLogMessageFormat(this.getClass().getName());
}
@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] | %d ms | %s", category, elapsed, formatSql(category, sql));
}
private String formatSql(String category, String sql) {
if (sql != null && !sql.trim().isEmpty() && Category.STATEMENT.getName().equals(category)) {
String trimmedSQL = sql.trim().toLowerCase(Locale.ROOT);
if (trimmedSQL.startsWith("create") || trimmedSQL.startsWith("alter") || trimmedSQL.startsWith("comment")) {
sql = FormatStyle.DDL.getFormatter().format(sql);
} else {
sql = FormatStyle.BASIC.getFormatter().format(sql);
}
return sql;
}
return sql;
}
}
자바로도 설정 가능
1. P6SpyConfig 클래스
- 동적 설정: P6Spy의 동작을 코드 기반으로 설정하고, Spring의 컨텍스트에서 동작하는 방식입니다.
- 장점:
- 코드에서 직접 포맷을 제어할 수 있어 더 유연한 설정이 가능합니다.
- Spring Boot의 DI(의존성 주입) 및 기타 설정들과 쉽게 연동됩니다.
- 복잡한 포맷이나 특정 로깅 로직을 구현하기 더 편리합니다.
- 단점: P6Spy의 설정을 코드에서 관리해야 하므로 설정을 변경할 때 코드 수정이 필요합니다.
2. spy.properties 파일
- 정적 설정: P6Spy의 설정을 별도의 설정 파일로 관리하는 방식입니다.
- 장점:
- 코드 수정 없이 spy.properties 파일에서 간단하게 설정을 변경할 수 있습니다.
- 개발 환경이나 운영 환경에서 설정을 쉽게 바꿀 수 있습니다.
- 단점:
- 포맷이 비교적 제한적입니다. 커스텀 포맷이 필요한 경우 코드보다 덜 유연합니다.
- 복잡한 로직을 설정 파일에 구현하기 어렵습니다.
둘 다 설정해야 할까?
- 필요에 따라 둘 다 사용할 수 있지만, 일반적으로는 둘 중 하나만 사용합니다.
- P6SpyConfig 클래스 사용: 코드 기반 설정을 선호하거나, Spring 환경에서 동적으로 설정을 관리하고 싶다면 이 클래스를 설정합니다.
- spy.properties 파일 사용: 간단한 설정 변경을 원하거나, 설정을 코드와 분리하여 운영 환경에서 쉽게 관리하고 싶다면 spy.properties 파일만 설정합니다.
728x90
반응형
'개발 > sql' 카테고리의 다른 글
2 Phase Lock & mysql -> MVCC (3) | 2024.11.06 |
---|---|
[분산] mysql 네임드락 (0) | 2024.11.01 |
[mysql] delete, drop, truncate (0) | 2024.10.02 |
[mysql] basic functions (0) | 2024.09.09 |
[mysql] collation이란 (0) | 2024.06.10 |