본문 바로가기
FullStack/21. Java

데이터베이스 쿼리 로그 log4jdbc

by nakanara 2012. 10. 11.
반응형

iBatis 등의 쿼리 로그를 볼때 SQL 문과 Parameter 부분이 따로 표시되어서

실제 쿼리를 테스트 하려면 일일이 맵핑등의 수작업이 필요합니다.

해당 과정을 처리한후 로그로 뽑아주는 Lib가 있어서 소개합니다.

 

적용시 크게 다른점은 없으며, logback or log4j 의 Log 프로퍼티의 변경 및 DB Driver, URL 변경만 작업해주면 됩니다.

 

# 해당 라이브러리가 한번 감싸서 다시 호출하는 방식으로 실제 해당 라이브러리는 개발시에만 사용!! 하세요.

아무래도 재호출 개념이 있다보니 약간이나마 시간적 소모가 걸리는 부분이 존재 할 수 도 있습니다.

 

 

관련 사이트 : http://code.google.com/p/log4jdbc/

log4jdbc3 의 경우 JDK1.4 and JDK1.5

log4jdbc4 의 경우 JDK1.6 and JDK1.7 용입니다.

 

 

# 적용방법

 

JDBC Dirver 와, URL, Logback(log4j) 프로퍼티 변경

 

(적용전)

spp.jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
spp.jdbc.url=jdbc:oracle:thin:@localhost:1521:ora


(적용후)

spp.jdbc.driverClassName=net.sf.log4jdbc.DriverSpy

spp.jdbc.url=jdbc:log4jdbc:oracle:thin:@localhost:1521:ora

  

 

- Logback.xml

  <!-- 관련 정보 http://magefister.egloos.com/2053938 -->
  <logger name="java.sql">
    <level value="ERROR"/>
  </logger>
  <!-- SQL문만을 로그로 남기며, PreparedStatement일 경우 관련된 argument 값으로 대체된 SQL문이 보여진다. -->
  <logger name="jdbc.sqlonly">
      <level value="debug"/>
  </logger>
  <!-- SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함한다. -->
  <logger name="jdbc.sqltiming">
      <level value="debug"/>
  </logger>
  <!-- ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남긴다. 많은 양의 로그가 생성되므로 특별히 JDBC 문제를 추적해야 할 필요가 있는 경우를 제외하고는 사용을 권장하지 않는다. -->
  <logger name="jdbc.audit">
      <level value="error"/>
  </logger>
  <!-- ResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남기므로 매우 방대한 양의 로그가 생성된다. -->
  <logger name="jdbc.resultset">
      <level value="error"/>
  </logger>

 

 

# 지원 가능한 DB 종류

Driver Class Database Type
oracle.jdbc.driver.OracleDriver Older Oracle Driver
oracle.jdbc.OracleDriver Newer Oracle Driver
com.sybase.jdbc2.jdbc.SybDriver Sybase
net.sourceforge.jtds.jdbc.Driver jTDS SQL Server & Sybase driver
com.microsoft.jdbc.sqlserver.SQLServerDriver Microsoft SQL Server 2000 driver
com.microsoft.sqlserver.jdbc.SQLServerDriver Microsoft SQL Server 2005 driver
weblogic.jdbc.sqlserver.SQLServerDriver Weblogic SQL Server driver
com.informix.jdbc.IfxDriver Informix
org.apache.derby.jdbc.ClientDriver Apache Derby client/server driver, aka the Java DB
org.apache.derby.jdbc.EmbeddedDriver Apache Derby embedded driver, aka the Java DB
com.mysql.jdbc.Driver MySQL
org.postgresql.Driver PostgresSQL
org.hsqldb.jdbcDriver HSQLDB pure Java database
org.h2.Driver H2 pure Java database

 

 

--기존 Sql Log --

[DEBUG] [http-bio-8080-exec-5] java.sql.Connection - {conn-101110} Connection
[DEBUG] [http-bio-8080-exec-5] java.sql.Connection - {conn-101110} Preparing Statement:      SELECT order_index orderIndex, id boardId, title, description, create_id createId,             to_char(create_dt, 'yyyymmddhh24miss') createDt,            start_dt startDt, end_dt endDt, company        FROM test_board      WHERE id  >  '0'        AND ( company = ? or share_yn = 0 )        AND (start_dt = 'continue' OR TO_CHAR (SYSDATE, 'yyyymmddhh24miss') BETWEEN start_dt AND  end_dt)   ORDER BY end_dt DESC, start_dt DESC, create_dt DESC 
[DEBUG] [http-bio-8080-exec-5] java.sql.PreparedStatement - {pstm-101111} Executing Statement:      SELECT order_index orderIndex, id boardId, title, description, create_id createId,             to_char(create_dt, 'yyyymmddhh24miss') createDt,            start_dt startDt, end_dt endDt, company        FROM test_board      WHERE id  >  '0'        AND ( company = ? or share_yn = 0 )        AND (start_dt = 'continue' OR TO_CHAR (SYSDATE, 'yyyymmddhh24miss') BETWEEN start_dt AND  end_dt)   ORDER BY end_dt DESC, start_dt DESC, create_dt DESC 
[DEBUG] [http-bio-8080-exec-5] java.sql.PreparedStatement - {pstm-101111} Parameters: [SHB]
[DEBUG] [http-bio-8080-exec-5] java.sql.PreparedStatement - {pstm-101111} Types: [java.lang.String]       

 

-- log4jdbc 로 변경시 Log --

(실행쿼리)

2. SELECT order_index orderIndex, id boardId, title, description, create_id createId, to_char(create_dt,
'yyyymmddhh24miss') createDt, start_dt startDt, end_dt endDt, company FROM test_board WHERE id > '0' AND ( company = 'SHB' or share_yn = 0 ) AND (start_dt = 'continue' OR TO_CHAR
(SYSDATE, 'yyyymmddhh24miss') BETWEEN start_dt AND end_dt) ORDER BY end_dt DESC, start_dt DESC,
create_dt DESC
 {executed in 3 msec}  (실행시간)

 

반응형