Web&Spring2020. 11. 29. 21:08

 

 

 

불편...

 

 

 

 

 

 

 

 

 

mybatis를 활용해서 쿼리 적용을 해놓으면..log4j에 기본적으로 저렇게 쿼리를 찍는데...

파라미터는 모두 ?,?로 찍히고 뒤에 Parameters : ... 이렇게 따로 찍히는데...매우 불편하다.

한번에 쿼리가 찍히면 디버깅하기 얼마나 편하던가...

그럴때는 log4jdbc를 이용한다. SQL 로그를 잘보이게 해주는 로그 라이브러리로,

2007소스포지에서 배퍼를 시작으로 2008년에 구글코드로 이전..2012년이후로 깃허브에 있다고..

적용방법은 간단하다.

일단 log4j2.xml이 있는 경로에 log4jdbc.log4j2.properties 파일을 추가해준다.

파일내용)

 

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

 

 

 

 

요렇게 호로록 넣고..

 

 

 

maven에서 pom.xml에 추가하던...jar파일을 추가하던 할 수 있다...

 

<dependency>
  <groupid>org.bgee.log4jdbc-log4j2</groupid>
  <artifactid>log4jdbc-log4j2-jdbc4.1</artifactid>
  <version>1.16</version>
</dependency>

 

 

이렇게 추가를 해주고...

context-datasource.xml(상황에 따라서 파일 이름은 다르겠지만 내경우엔 이 이름을 이용함)

에서 driverClassName을 "net.sf.log4jdbc.sql.jdbcapi.DriverSpy"로 지정해준다.

 

<!-- Oracle -->
	  <bean id="dataSource-oracle" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
	    <property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"/>
	    <property name="url" value="${Globals.Url}" />
	    <property name="username" value="${Globals.UserName}"/>
	    <property name="password" value="${Globals.Password}"/>
	  </bean>

 

 

globals.properties에서 jdbc:와 oracle: 사이에 log4jdbc:를 넣어준다.

 

 

 

그리고 필요에 맞게 log4j2.xml 설정 파일을 변경해주고..

프로젝트를 재구동하면 적용이 된다.

로그 이름은 아래에 정리)

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을 로그로 남긴다.

로그 설정 예..)

 

 

<?xml version="1.0" encoding="UTF-8"?>
<!-- FATAL > ERROR > WARN > INFO > DEBUG > TRACE -->
<Configuration>
    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %5p [%c][%L LINE] %m%n" />
        </Console>
        <!-- Query Loggers 쿼리 과정(파라미터까지) -->
        <appender name="console-dblog" class="org.apache.log4j.ConsoleAppender"> 
	         <PatternLayout pattern="%d %5p %m%n" />
        </appender>
    </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>
        <Logger name="org.springframework" level="ERROR" additivity="false">
            <AppenderRef ref="console" />
        </Logger>
        <!-- Query Loggers 쿼리(파라미터까지) --> 
        <Logger name="jdbc.sqlonly" additivity="false"> 
	        <level value="DEBUG"/> 
	        <appender-ref ref="console" />
        </Logger>
        <!--  SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함한다. 필요시 open -->
        <Logger name="jdbc.sqltiming" level="ERROR" additivity="false">
            <AppenderRef ref="WARN" />
        </Logger>
        <!--  SQL 결과 조회된 데이터의 table을 로그로 남긴다.(빼도됨) -->
        <Logger name="jdbc.resultsettable" additivity="false"> 
	        <level value="WARN"/> 
	        <appender-ref ref="console"/> 
        </Logger>
        <!-- ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남긴다. 많은 양의 로그가 생성되므로 특별히 JDBC 문제를 추적해야 할 필요가 있는 경우를 제외하고는 사용을 권장하지 않는다.--> 
        <Logger name="jdbc.audit" additivity="false"> 
	        <level value="WARN"/> 
	        <appender-ref ref="console"/> 
        </Logger>
        <!-- ResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남기므로 매우 방대한 양의 로그가 생성된다. -->
        <Logger name="jdbc.resultset" additivity="false"> 
	        <level value="WARN"/> 
	        <appender-ref ref="console"/> 
        </Logger>
        <Root level="DEBUG">
            <AppenderRef ref="console" />
        </Root>
    </Loggers>
</Configuration>

 

 

 

 

 

전체 쿼리가 파라미터까지 그대로 나오고...

 

 

 

필요한 경우 설정하면 결과 테이블까지 이렇게 정리해서 찍어준다.

 

 

 

 

 

Posted by 사슴영혼'-'