반응형
해당 글에서는 MyBatis로 처리되는 Query에 대한 Formatting을 적용하기 위해 ‘log4 jdbc-log4j2’를 적용하는 글에 대해 공유합니다.
1) log4jdbc-log4j2
💡 log4jdbc-log4j2
- 자바 애플리케이션에서 ‘JDBC 드라이버를 사용’할 때, SQL문의 실행 로그를 자동으로 기록해 주는 라이브러리입니다. 또한 MyBatis를 사용하는 경우 Query Formatting을 지원하여 실제 실행되는 쿼리에 대해 문자열로 확인이 가능합니다.
- 기본적으로 Log4j2를 지원하며 구현체인 Slf4j에서 사용이 가능하며 SQL을 실행할 때마다 자동으로 로그를 남겨 디버깅과 모니터링을 수행할 수 있습니다.
- 해당 버전은 ‘log4 jdbc-remix’의 모든 개선사항을 포함하고 있으며 이후에 출시가 되었습니다. 주로 개발 단계에서 SQL문을 편리하게 보거나 중요한 쿼리의 수행을 위해 사용합니다.
[참고] log4 jdbc-log4 j2 관련 자료
Maven Repository: org.bgee.log4jdbc-log4j2 » log4jdbc-log4j2-jdbc4.1 » 1.16
1. 주요 기능
💡 log4jdbc-log4j2의 주요 기능에 대해서 확인합니다.
각각의 기능의 주된 목적은 SQL문에서 발생하는 실행에 따른 동작들을 추적하여 콘솔상에 출력을 하거나 로그 파일에 포함시켜서 출력이 가능합니다.
기능 | 설명 |
PreparedStatement 추적 | 실행된 PreparedStatement 객체와 그 파라미터를 로깅합니다. |
CallableStatement 추적 | 실행된 CallableStatement 객체와 그 파라미터를 로깅합니다. |
ResultSet 추적 | 실행된 쿼리에 대한 ResultSet을 로깅합니다. |
사용자 SQL 추적 | 사용자가 실행한 SQL을 로깅합니다. |
배치 SQL 추적 | 배치 SQL문을 로깅합니다. |
Connection 추적 | Connection 객체 생성, 반환, 커밋, 롤백, setAutoCommit 호출 등과 같은 Connection 객체에 대한 이벤트를 로깅합니다. |
DataSource 추적 | DataSource가 반환하는 Connection 객체 생성 및 반환, 커밋, 롤백, setAutoCommit 호출 등과 같은 이벤트를 로깅합니다. |
ResultSet 처리 추적 | ResultSet 처리와 관련된 정보를 로깅합니다. (예: fetchSize, ResultSet 객체 생성 및 반환) |
SQL 예외 처리 추적 | SQL 예외 처리와 관련된 정보를 로깅합니다. |
2) 환경설정
1. 의존성 주입
dependencies {
implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4:1.16' // MyBatis Query Formatter
}
2. log4jdbc.log4j2.properties
💡 log4jdbc.log4j2.properties
- JDBC 드라이버의 동작을 사용자 정의하는 구성 파일입니다. 이 파일을 사용하여 드라이버의 로깅 출력, 로그 레벨, 어펜더 및 포맷팅과 같은 것을 제어할 수 있습니다.
💡 resources/log4jdbc.log4j2.properties 파일을 생성하고 아래와 같은 속성으로 적용하였습니다.
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength=0
💡 log4jdbc.log4j2.properties 속성
속성 | 설명 |
log4jdbc.spylogdelegator.name | 로그4jdbc에서 사용할 로그 델리게이트(Delegate)의 이름을 지정합니다. 이 구성을 통해 로그 델리게이트를 변경할 수 있습니다. 이 코드에서는 SLF4J를 사용하는 net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator가 지정되어 있습니다. |
log4jdbc.dump.sql.maxlinelength: | SQL문의 최대 길이를 지정합니다. 이 속성은 SQL문을 자동 줄 바꿈하는 데 사용됩니다. 이 코드에서는 0으로 설정되어 있으므로 SQL문의 길이에 제한이 없습니다. |
log4jdbc.spylogdelegator.name | 로그4jdbc에서 사용할 로그 델리게이트(Delegate)의 이름을 지정합니다. 이 구성을 통해 로그 델리게이트를 변경할 수 있습니다. 이 코드에서는 SLF4J를 사용하는 net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator가 지정되어 있습니다. |
log4jdbc.dump.sql.maxlinelength | SQL문의 최대 길이를 지정합니다. 이 속성은 SQL문을 자동 줄 바꿈하는 데 사용됩니다. 이 코드에서는 0으로 설정되어 있으므로 SQL문의 길이에 제한이 없습니다. |
log4jdbc.auto.load.popular.drivers | 자주 사용되는 드라이버를 자동으로 로드할지 여부를 지정합니다. 이 코드에서는 true로 설정되어 있습니다. |
log4jdbc.trim.sql.enabled | SQL 문의 앞뒤 공백을 자동으로 제거할지 여부를 지정합니다. 이 코드에서는 true로 설정되어 있습니다. |
log4jdbc.trim.sql.extrablanklines | SQL 문의 공백 라인을 제거할지 여부를 지정합니다. 이 코드에서는 false로 설정되어 있습니다. |
log4jdbc.suppress.generated.keys.exception | SQL 문에서 생성된 키 예외를 억제할지 여부를 지정합니다. 이 코드에서는 false로 설정되어 있습니다. |
3. 데이터베이스 연결 설정 : application.properties / x-local.yml
💡 datasource에서 driver-class-name, jdbc-url 속성에 대해서 아래와 같이 수정합니다.
spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:postgresql://localhost:5432/multiflex
spring.datasource.name=X
spring.datasource.password=X
spring:
datasource:
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
url: jdbc:log4jdbc:postgresql://localhost:5432/multiflex
name: X
password: X
4. Log4j2 환경 파일 수정
💡 이전에 작성한 log4j2 글에 이어서 구성을 하였으며 jdbc 관련하여 불필요한 데이터를 제외하고 쿼리 및 파라미터 / 데이터 조회에 대해서만 출력하도록 구성하였습니다.
Logger Name | 설명 |
jdbc | JDBC 드라이버 자체의 로그 |
jdbc.sqlonly | SQL 문장만 로그 |
jdbc.resultsettable | SQL 쿼리 실행 결과를 테이블 형태로 로그 |
jdbc.audit | 데이터베이스 변경 로그 |
jdbc.resultset | SQL 쿼리 실행 결과를 로그 |
jdbc.connection | Connection 관련 로그 |
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<!-- 파일정보 -->
<Properties>
<Property name="infoLogNm">./logs/tugboatApi/api_info.log</Property>
<Property name="errorLogNm">./logs/tugboatApi/api_error.log</Property>
<Property name="authLogNm">./logs/tugboatApi/api_auth.log</Property>
<Property name="jsonInfoLogNm">./logs/tugboatApi/api_json_info.log</Property>
<Property name="layoutPattern">%style{%d{UTF-8}}{black} %highlight{%-5level} [%style{%t}{bright,blue}] %style{%C}{bright,yellow}: %msg%n%throwable
</Property>
</Properties>
<!-- 생성 파일 정보 -->
<Appenders>
<Console name="Console_Appender" target="SYSTEM_OUT">
<PatternLayout pattern="${layoutPattern}"/>
</Console>
<!-- INFO level -->
<File name="File_Info_Appender">
<fileName>${infoLogNm}</fileName>
<PatternLayout>
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</PatternLayout>
</File>
<!-- ERROR level -->
<File name="File_Error_Appender">
<fileName>${errorLogNm}</fileName>
<PatternLayout>
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</PatternLayout>
</File>
<!-- AUTH management -->
<File name="File_Auth_Appender">
<fileName>${authLogNm}</fileName>
<PatternLayout>
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</PatternLayout>
</File>
<!-- JSON api info -->
<File name="File_Json_info_Appender">
<fileName>${jsonInfoLogNm}</fileName>
<PatternLayout>
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</PatternLayout>
</File>
</Appenders>
<!-- 로그 범위 -->
<Loggers>
<!-- MyBatis 관련 로그 설정-->
<logger name="jdbc" level="OFF"/>
<logger name="jdbc.sqlonly" level="INFO"/>
<logger name="jdbc.resultsettable" level="INFO"/>
<logger name="jdbc.audit" level="OFF"/>
<logger name="jdbc.resultset" level="OFF"/>
<logger name="jdbc.connection" level="OFF"/>
<!-- Default 세팅 -->
<root additivity="false" level="OFF">
<AppenderRef ref="Console_Appender"/>
</root>
</Loggers>
</Configuration>
3) 최종 결과값 확인
💡 아래와 같이 결과값이 잘 출력됨을 확인하였습니다.
4) MySQL을 사용하는 경우 경고 메시지 : Loading class 'com.mysql.jdbc.Driver'. This is deprecated.
1. 문제점
💡 문제 메시지
- Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
💡 해당 문제는 ‘com.mysql.jdbc.Driver’를 사용하는것이 deprecated 되었다고 합니다. 그래서 새로운 드라이버 클래스인 ‘com.mysql.cj.jdbc.Driver’를 사용하기를 권고하고 있습니다.
2. 해결방법
💡 위에서 구성한 log4jdbc.log4j2.properties 파일 내에 속성을 추가합니다.
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength=0
# 아래의 내용을 추가합니다.
log4jdbc.auto.load.popular.drivers=false
log4jdbc.drivers=com.mysql.cj.jdbc.Driver
💡 해결이 되었음을 확인하였습니다.
오늘도 감사합니다. 😀
반응형