[JAVA/Spring] SQL 로그 출력하기
이 포스팅의 샘플 게시판 개발 환경은 MAC OS, STS, OpenJDK11 입니다.
SQL 로그 출력하기
의존성 추가
pom.xml 을 열어 아래의 내용을 추가합니다.
<!-- https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4 -->
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
<version>1.16</version>
</dependency>
데이터베이스 접속 설정 수정
데이터베이스 접속 설정이 들어 있는 설정파일 (root-context.xml 또는 dataSource-context.xml)을 수정해야 합니다.
<!--dataSource 객체 설정 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!-- 아래의 기존 내용은 주석 처리 하거나 삭제 합니다.-->
<!-- <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mess?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC" /> -->
<property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy" />
<property name="url" value="jdbc:log4jdbc:mysql://127.0.0.1:3306/mess?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC" />
<property name="username" value="mess"></property>
<property name="password" value="mess"></property>
</bean>
붉은 색 부분이 수정된 부분입니다. 정확히는 value의 일부분이 수정되었습니다. 수정된 내용은 아래와 같습니다.
com.mysql.cj.jdbc.Driver -> net.sf.log4jdbc.sql.jdbcapi.DriverSpy
jdbc:mysql://127.0.0.1:3306/생략 ->jdbc:log4jdbc:mysql://127.0.0.1:3306/생략
properties 파일 신규 생성
log4jdbc.log4j2.properties 파일을 새로 추가 해야 합니다.
위치는 log4j.xml이 있는 /src/main/resources 에 만들도록 합니다.
log4jdbc.log4j2.properties
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
파일의 내용은 위와 같이 딱 한 줄 입니다.
log4j.xml 수정
마지막으로 어떤 로그를 출력할지 log4j.xml에 속성을 추가 합니다.
log4j.xml 수정
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- Appenders -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p: %c - %m%n" />
</layout>
</appender>
<!-- Application Loggers -->
<logger name="com.freehoon.web">
<level value="info" />
</logger>
<!-- 3rdparty Loggers -->
<logger name="org.springframework.core">
<level value="info" />
</logger>
<logger name="org.springframework.beans">
<level value="info" />
</logger>
<logger name="org.springframework.context">
<level value="info" />
</logger>
<logger name="org.springframework.web">
<level value="info" />
</logger>
<!-- SQL Logger -->
<logger name="jdbc.sqltiming" additivity="false">
<level value="warn" />
<appender-ref ref="console"/>
</logger>
<logger name="jdbc.sqlonly" additivity="false">
<level value="info"/>
<appender-ref ref="console"/>
</logger>
<logger name="jdbc.audit" additivity="false">
<level value="warn"/>
<appender-ref ref="console"/>
</logger>
<logger name="jdbc.resultset" additivity="false">
<level value="warn" />
<appender-ref ref="console"/>
</logger>
<logger name="jdbc.resultsettable" additivity="false">
<level value="info"/>
<appender-ref ref="console"/>
</logger>
<!-- Root Logger -->
<root>
<priority value="warn" />
<appender-ref ref="console" />
</root>
</log4j:configuration>
붉은색으로 표시한 부분이 로그를 출력하기 위해 추가된 부분입니다.
로그 이름과 레벨은 아래의 표를 참조하시면 됩니다.
로그 이름 정리
name |
의미 |
jdbc.sqlonly |
SQL 쿼리 문장만 로그로 남긴다. PreparedStatement일 경우 관련된 argument 값으로 대체된 SQL문이 보여진다. |
jdbc.sqltiming |
SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함한다. |
jdbc.audit |
ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남긴다. 많은 양의 로그가 생성되므로 특별히 JDBC 문제를 추적해야 할 필요가 있는 경우를 제외하고는 사용을 권장하지 않는다. |
jdbc.resultset |
ResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남기므로 매우 방대한 양의 로그가 생성된다. |
jdbc.resultsettable |
SQL 결과 조회된 데이터의 table을 로그로 남긴다. |
로그 레벨 정리
순서 |
레벨 |
내용 |
1 |
DEBUG |
debug을 위한 용도로, 일반 정보를 상세하게 출력합니다. |
2 |
INFO |
일반적인 데이터를 출력합니다. |
3 |
WARN |
경고성 메시지로, 에러가 아닌 처리 가능한 문제를 출력 합니다. |
4 |
ERROR |
일반적인 에러로 처리가 반드시 필요로 하는 문제를 출력 합니다. |
5 |
FATAL |
시스템에 심각한 문제를 일이킬 수 있는 문제를 출력합니다. |
여기서 로그 레벨은 중요한 의미를 갖습니다.
예를 들어 로그 레벨을 'WARN' 으로 설정하면 그 이전 레벨('DEBUG','INFO') 등을 출력하지 않습니다.
즉, 경고성 문제가 발생하지 않는 이상 로그가 찍히지 않습니다.
따라서 일반적으로 SQL 쿼리 문장이 제대로 된 문장인지를 확인 하고 싶을때는 'DEBUG' 나 'INFO' 등으로 설정을 합니다.
위의 설정 예는 일반적인 SQL문장(sqlonly)과 그 문장의 결과(resultsettable)를 로그에 출력 할 수 있도록 로그 레벨을 'INFO' 로 설정하였습니다.
위에 log4j.xml의 설정을 따르면 로그는 아래와 같이 출력 됩니다.
※ 포스팅에 오타나 잘못된 부분, 추가적으로 더 알고 싶은 부분이 있으면 댓글 주세요~