반응형

P6Spy: Java 기반 애플리케이션에서 SQL 쿼리의 로깅 및 모니터링을 위한 프레임워크

P6Spy 주요 기능:

  • SQL 로깅: 애플리케이션에서 실행되는 모든 SQL 쿼리, 매개변수, 실행 시간을 기록합니다.
  • 성능 모니터링: 각 쿼리의 실행 시간을 보여주어 느린 쿼리를 식별하는 데 도움을 줍니다.
  • 동적 필터링: SELECT, UPDATE 등의 특정 쿼리 유형을 필터링하여 로그에서 제외할 수 있습니다.
  • 간편한 사용: 표준 JDBC 드라이버 대신 P6Spy 드라이버를 사용하여 SQL 쿼리를 감시하고 로깅합니다.

동작 방식:

  1. 스파이 드라이버: P6SpyDriver가 실제 JDBC 드라이버를 감싸고 모든 SQL 쿼리를 가로챕니다.
  2. 로그 기록: 쿼리를 콘솔 또는 파일로 기록하며, 로그 포맷은 커스터마이징 가능합니다.
  3. 분석: 로그를 통해 느린 쿼리를 찾아 성능을 최적화하거나, 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

+ Recent posts