헤르메스 LIFE

[Spring] log4jdbc-remix 를 이용한 쿼리 로그 출력하기 본문

Spring Framework

[Spring] log4jdbc-remix 를 이용한 쿼리 로그 출력하기

헤르메스의날개 2020. 12. 6. 03:06
728x90

 

         <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>

log4jdbc-remix는 2013-11-06일 개발중지되었습니다.

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

그래서, log4jdbc-remix와 log4jdbc의 다른 분기(fork)인 log4jdbc-log4j2를 사용하라고 하네요. ( 이게 최신입니다. )

(https://code.google.com/p/log4jdbc-log4j2/)


jdbc.properties

MySQL.DriverClassName = com.mysql.jdbc.Driver MySQL.url = jdbc:mysql://localhost:3306/spring?useUnicode=yes&characterEncoding=UTF8&autoReconnect=true&autoReconnectForPools=true MySQL.UserName = spring MySQL.Password = spring
<bean id="jdbcProp" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc.properties" />
</bean>

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

<!-- mysql --> 
<bean id="dataSourceMysql" class="net.sf.log4jdbc.Log4jdbcProxyDataSource"> 
	<constructor-arg ref="dataSourceMySqlSpied" /> 
	<property name="logFormatter"> 
		<bean class="com.tistory.pentode.log.Log4JdbcCustomFormatter"> 
			<property name="loggingType" value="MULTI_LINE" /> 
			<!-- <property name="margin" value="8" /> -->
			<property name="sqlPrefix" value="SQL:" /> 
		</bean> 
	</property> 
<bean> 
<bean id="dataSourceMySqlSpied" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
	<property name="driverClassName" value="${MySQL.DriverClassName}"/> 
	<property name="url" value="${MySQL.Url}" /> 
	<property name="username" value="${MySQL.UserName}"/> 
	<property name="password" value="${MySQL.Password}"/> 
</bean>
	
<?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 설정)


출처 : junshock5.tistory.com/124

  • slf4j
    • Logger 추상체로 slf4j는 logback이나 log4j2와 같은 프레임워크의 인터페이스의 역할을 해주기 때문에  로깅 구현체가 바뀌더라도 생각보다 어렵지않게 변경할 수 있습니다. 기능이 너무 단순하여 실제로는 사용할 필요가 없긴합니다. 
  • Log4j Logback Log4j2 순서로 등장했습니다.
      • log4j
        • 콘솔로 출력하는 stdout 외에도 파일 출력도 제공합니다. 
          하지만 2015년에 개발이 중단되었기 때문에 기존 시스템이 아니라면 사용할 이유가 없습니다.
      • logback
        • log4j2 전에 개발된 로깅프로그램으로 log4j에서 향상된 성능과 필터링 옵션을 제공합니다. 
          slf4j
          도 지원합니다. 그리고 자동 리로드도 가능합니다.
      • log4j2
        • logback과 동일하게 자동 리로드 기능과 필터리 기능을 제공합니다. logback과 차이점은 Apache에 따르면 멀티 쓰레드 환경에서 비동기 로거(Async Logger)의 경우 Log4j 1.x 및 Logback보다 처리량이 18배 더 높고 대기 시간이 훨씬 더 짧다. 아래 그래프에서 성능 차이를 확인 해볼수 있다. 그리고 람다 표현식과 사용자 정의 로그 레벨도 지원합니다.

https://logging.apache.org/log4j/2.x/performance.html

 

728x90