보통 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/ )
댓글