보통 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/

출처 : https://mine-it-record.tistory.com/203

 

+ Recent posts