개발/JAVA, Spring

[JAVA/Spring] SQL 로그 출력하기

똘똘이박사 2019. 2. 19. 14:14



이 포스팅의 샘플 게시판 개발 환경은 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&amp;useSSL=false&amp;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&amp;useSSL=false&amp;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의 설정을 따르면 로그는 아래와 같이 출력 됩니다.









※ 포스팅에 오타나 잘못된 부분, 추가적으로 더 알고 싶은 부분이 있으면 댓글 주세요~


반응형