보통 log를 출력하는데 log4jdbc를 사용하는데


이 log 출력은


일반적으로 사용하는데는 큰 문제가없는데


쿼리를 출력하는 과정이 문제이다


SELECT * FROM table WHERE e_id = ?


라는 쿼리문이 있다면


콘솔에는 그대로 ?로 명시되어있는 쿼리문을 그대로 출력하고


그 아래에 파라미터를 따로 번호대로 출력하는게 문제이다.









짧은 쿼리문이면 상관이 없지만


파라미터가 수십개로 넘어간다면 직관적으로 확인이 불가능하고

파악하기도 굉장히 힘들다.


?로 출력되는 위치에 삽입된 파라미터가 출력되는것을 보기위해


' log4jdbc-remix ' 를 사용해보자.



pom.xml 설정



        <dependency>  
            <groupId>org.lazyluke</groupId>  
             <artifactId>log4jdbc-remix</artifactId>  
              <version>0.2.7</version>  
        </dependency>  
 
        <dependency>  
              <groupId>org.slf4j</groupId>  
             <artifactId>slf4j-log4j12</artifactId>  
            <version>1.6.1</version>  
        </dependency>



( '0.2.7 버전' 을 사용하는 이유는 안정적인 버전이라 나와있어서 그렇다. )


- context-datasource.xml 설정


    <!-- oracle --> 
    <bean id="dataSourceSpied" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${Globals.DriverClassName}"/>
        <property name="url" value="${Globals.Url}" />
        <property name="username" value="${Globals.UserName}"/>
        <property name="password" value="${Globals.Password}"/>
    </bean>
    
    <bean id="dataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource">
    <constructor-arg ref="dataSourceSpied" />
    <property name="logFormatter">
        <bean class="net.sf.log4jdbc.tools.Log4JdbcCustomFormatter">
            <property name="loggingType" value="MULTI_LINE" />
            <property name="sqlPrefix" value="SQL:::" />
        </bean>
    </property>
</bean>



기존에 있던 dataSource 소스 부분 아래에 새로 추가해주고 위와같이 그냥 선언 해주면 된다.


* 여기서 가끔 class를 찾지 못하거나 그냥 알수없는 에러가 발생하는 경우가 있는데 그경우 jar파일이 제대로 pom.xml을 통해서 설치가 안된것이니 maven을 clean하고 재 install해주자.


* 그리고 블로그에있는것을 긁어다가 붙어넣기 할 경우 가끔 더블쿼터가 에러가 발생하는데 그건 다시 직접 더블쿼터로 감싸주면 해결된다.


- log4j2.xml 설정


<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %5p [%c] %m%n" />
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="java.sql" level="DEBUG" additivity="false">
            <AppenderRef ref="console" />
        </Logger>
        <Logger name="egovframework" level="DEBUG" additivity="false">
            <AppenderRef ref="console" />
        </Logger>
          log SQL with timing information, post execution
        <Logger name="jdbc.sqltiming" level="DEBUG" additivity="false">
            <AppenderRef ref="console" />
        </Logger>
        <Logger name="org.springframework" level="DEBUG" additivity="false">
            <AppenderRef ref="console" />
        </Logger>
        <Logger name="jdbc.resultsettable" additivity="false"
            <level value="info" /
            <appender-ref ref="console-log4jdbc" />
        </Logger>
    </Loggers>
</Configuration>
 



현재 내 환경에서 설정되어 있는 부분이고 똑같이 할 필요없이 그냥 찾아서 필요한부분만 넣어주면 된다.


jdbc.sqlonly : SQL문만을 로그로 남기며, PreparedStatement일 경우 관련된 argument 값으로 대체된 SQL문이 보여진다.

jdbc.sqltiming : SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함한다.

jdbc.audit : ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남긴다. 많은 양의 로그가 생성되므로 특별히 JDBC 문제를 추적해야 할 필요가 있는 경우를 제외하고는 사용을 권장하지 않는다.

jdbc.resultset : ResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남기므로 매우 방대한 양의 로그가 생성된다.

jdbc.resultsettable : SQL 결과 조회된 데이터의 table을 로그로 남긴다.

jdbc.connection : 열려있는 모든 번호와 연결 수립 및 해제 이벤트를 기록. 이는 연결 문제를 찾아내는데 매우 유용 (Connection Pool 설정)


출처 : https://jinyoung8806.github.io/spring/spring-sql-logging/



(저리 jdbc.sqlonly가 있는데 왜 log4jdbc-remix 이걸 쓰는지는 아직 잘 모르겠다...)






이런식으로 위에서 ?로 출력되는 부분이 파라미터가 채워진 상태로 출력된다.






( 참고 : https://code.google.com/archive/p/log4jdbc-remix/ )


반응형