프로젝트를 진행하며, 예상치 않게 오류가 발생하거나 원하지 않은 데이터가 뿌려진 경험이 있다. 이럴 때 마다 문득 내가 작성한 SQL문에 문제가 있는지 로그로 찍어 보고싶어서 log4j2를 이용하여 SQL문과 데이터를 출력하는 작업을 추가하였다.
1. pom.xml에 log4j2 dependency 추가
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
<version>1.16</version>
</dependency>
2. 기존 application.properties 내용 수정
기존 DB 소스코드
#spring.datasource.url: jdbc:mysql://localhost/covid #spring.datasource.username: root #spring.datasource.password: 1234
#spring.datasource.driver-class-name:com.mysql.cj.jdbc.Driver
변경 DB 소스코드
spring.datasource.url: jdbc:log4jdbc:mysql://localhost/covid spring.datasource.username: root spring.datasource.password: 1234
spring.datasource.driver-class-name:net.sf.log4jdbc.sql.jdbcapi.DriverSpy
3. log4jdbc.log4j2.properties 생성
src/main/resources 아래 log4jdbc.log4j2.properties 파일을 이름 그대로 생성하여 추가한다.
* properties 파일 생성 방법
프로젝트 우클릭 -> new -> other -> Untitled Text File -> Finish -> 좌측 상단 File -> Save As -> 파일을 저장할 위치 지정 및 파일명 log4jdbc.log4j2.properties으로 변경
log4jdbc.log4j2.properties 파일을 추가 한 뒤 아래 소스 코드 작성
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength=0
여기까지만 해도 서버 구동 후 쿼리 수행하는 기능을 작동해 보면 이전과는 다른, 매우 디테일한 수많은 로그들이 올라올 것이다. 별다른 셋팅을 해 주지 않으면, 기본적으로 log4jdbc가 제공하는 모든 로깅 옵션들이 다 켜진 상태로 로그를 출력한다.
하지만 더 보기 좋은 모습으로 로그를 출력하기 위해 아래 4번 작업을 추가해주자.
4. logback.xml 파일 생성
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyyMMdd HH:mm:ss.SSS} [%thread] %-3level %logger{5} - %msg %n</pattern>
</encoder>
</appender>
<logger name="jdbc" level="OFF"/>
<logger name="jdbc.sqlonly" level="OFF"/>
<logger name="jdbc.sqltiming" level="DEBUG"/>
<logger name="jdbc.audit" level="OFF"/>
<logger name="jdbc.resultset" level="OFF"/>
<logger name="jdbc.resultsettable" level="DEBUG"/>
<logger name="jdbc.connection" level="OFF"/>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
마찬가지로 src/main/resources 경로에 logback.xml파일을 생성하여 위 소스코드를 작성해준다.
- jdbc.sqlonly : SQL문만을 로그로 남기며, PreparedStatement일 경우 관련된 argument 값으로 대체된 SQL문이 보여진다.
- jdbc.sqltiming : SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함한다.
- jdbc.audit : ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남긴다. 많은 양의 로그가 생성되므로 특별히 JDBC 문제를 추적해야 할 필요가 있는 경우를 제외하고는 사용을 권장하지 않는다.
- jdbc.resultset : ResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남기므로 매우 방대한 양의 로그가 생성된다.
- jdbc.resultsettable : SQL 결과 조회된 데이터의 table을 로그로 남긴다.
5. 결과 예시
'프로그래밍 > Spring' 카테고리의 다른 글
[Spring] @Valid @Validated와 유효성 검사 Annotation (0) | 2023.01.03 |
---|---|
[Spring] 예외처리 (@ExceptionHandler, @ControllerAdvice) (0) | 2022.04.17 |
[Spring] log4j (0) | 2022.03.28 |
[Spring] @Transactional (0) | 2022.03.28 |
[Spring] SpringSecurity 비밀번호 암호화 (0) | 2022.03.15 |