Daily Notebook

[Mybatis] Log4j 로그찍기

by 배부른코딩로그
애플리케이션에서 로그는 중요하다! 이번엔 Mybatis SQL 로그를 찍는 법을 소화해보자.

 

로그는 항상 읽기 쉽고 명확하게 출력해야 모니터링 할 때 편한다

이번에는 Mybatis를 사용할 때 SQL query 로그를 깔끔하게 찍는 방법을 기록한다.

 

Log4Jdbc Remix를 사용하면 편하게 로그를 출력할 수 있다.

1. dependency

<!-- https://mvnrepository.com/artifact/org.lazyluke/log4jdbc-remix -->
<dependency>
    <groupId>org.lazyluke</groupId>
    <artifactId>log4jdbc-remix</artifactId>
    <version>0.2.7</version>
</dependency>

 

2. root-context.xml or db-datasource.xml

<bean id="jndiSourceTrade" class="org.springframework.jndi.JndiObjectFactoryBean">       
	<property name="jndiName" value="java:/comp/env/jdbc/testdb" />
</bean>
<bean id="dataSource-trade" class="net.sf.log4jdbc.Log4jdbcProxyDataSource">
	<constructor-arg ref="jndiSourceTrade" />
	<property name="logFormatter">
	<bean class="net.sf.log4jdbc.tools.Log4JdbcCustomFormatter">
		<property name="loggingType" value="MULTI_LINE" />
		<property name="sqlPrefix" value="[SQL]: "/>
	</bean>
	</property>
</bean>

해당 코드에서 특이한 점은 JNDI를 사용했다는 점이다. JNDI를 사용하면 jndiObjectFactoryBean을 통해 빈 객체를 만들고, DataSource 빈 객체에 생성자로 참조해야 한다.

 

3. log4j.xml

<!-- Query Loggers -->
<logger name="jdbc.sqltiming" additivity="false">
	<level value="INFO"/>
	<appender-ref ref="CONSOLE"/>
	<appender-ref ref="FILE_APPENDER"/>
</logger>
<logger name="jdbc.sqlonly" additivity="false">
	<level value="INFO"/>
	<appender-ref ref="CONSOLE"/>
	<appender-ref ref="FILE_APPENDER"/>
</logger>
<logger name="jdbc.resultset" additivity="false">
	<level value="WARN"/>
	<appender-ref ref="CONSOLE"/>
	<appender-ref ref="FILE_APPENDER"/>
</logger>
<logger name="jdbc.resultsettable" additivity="false">
	<level value="WARN"/>
	<appender-ref ref="CONSOLE"/>
	<appender-ref ref="FILE_APPENDER"/>
</logger>
<logger name="jdbc.audit" additivity="false">
	<level value="WARN"/>
	<appender-ref ref="CONSOLE"/>
	<appender-ref ref="FILE_APPENDER"/>
</logger>
<logger name="jdbc.connection" additivity="false">
	<level value="WARN"/>
	<appender-ref ref="CONSOLE"/>
	<appender-ref ref="FILE_APPENDER"/>
</logger>

위와 같은 logger name 을 가진 속성들을 추가하면 된다.

 

각 logger name에 대한 기능은 다음과 같습니다. (개인적으로 위 LEVEL이 가장 깔끔!)

Name Function
jdbc.sqlonly SQL 로그 기록. PreparedStatement일 경우, 실행된 SQL은 가독성을 위해 해당 위치에서 바인딩된 데이터로 대체된 바인딩 인수를 자동으로 표시. (보기 편함)
jdbc.sqltiming SQL 로그 기록. 그리고 해당 쿼리를 실행시키는데 실행 시간 정보(milliseconds) 포함.
(SQL 분석시 유용)
jdbc.audit ResultSet을 제외한 모든 JDBC 호출 정보 기록.
많은 양의 로그가 생성되기 때문에 JDBC 문제를 추적하지 않는 한 일반적으로 사용 X
jdbc.resultset ResultSet을 포함한 모든 JDBC 호출 정보 기록. 따라서, 매우 방대한 양의 로그 기록.
jdbc.resultsettable jdbc 결과를 표로 기록, 조회된 데이터의 테이블 정보 출력.
jdbc.connection 열려있는 모든 번호와 연결 수립 및 해제 이벤트를 기록. 이는 연결 문제를 찾아내는데 매우 유용. (Connection Pool)

 

 

[출처] http://log4jdbc.brunorozendo.com/

 

반응형

블로그의 정보

배부른코딩로그

배부른코딩로그

활동하기