민서네집

스프링에서 SQL 로그 사용하기 (log4jdbc,log4sql) 본문

Spring

스프링에서 SQL 로그 사용하기 (log4jdbc,log4sql)

브라이언7 2014. 12. 11. 16:37

Spring Framework에서 log4j를 사용하면 DB 에러가 났을때 Parameter 정보를 볼 수 없다.


혹시 다른 DB에 특화된 라이브러리를 사용하면 DB에서 에러가 났을때 파라미터 정보를 볼 수 있을까?




참조할 만한 Posting은 다음과 같다.


스프링에서 SQL 로그 사용하기 (log4jdbc,log4sql)


http://beyondj2ee.tumblr.com/post/14509278613/sql-log4jdbc-log4sql


위 블로그를 참조하여 테스트 해 보았더니 log4jdbc 라이브러리는 DB 에러가 났을때 Parameter 정보를 볼 수 있었다.


log4sql 은 아직 테스트 해 보지 않았다.


log4jdbc의 경우  mvnrepository.com 에서 검색이 되었고, log4sql 은 검색되지 않았다.


http://mvnrepository.com/artifact/com.googlecode.log4jdbc/log4jdbc/1.2


log4jdbc의 경우는 에러 발생 시 쿼리가 파라미터 정보가 입력된 채로 여러 줄에 걸쳐서 보여지기는 하지만, 정리되어 보이지는 않았다.


위 블로그에 의하면 log4sql은 sql로그가 직관적으로 나온다고 하는데, 내부적으로 System.out.println 콘솔출력한다고 하니 운영 시스템에 적용하기는 힘들것 같다. (Maven Repository에도 없고)


log4jdbc의 경우 log4j.properties 파일 설정을 INFO로 했더니, 로그가 너무 많이 찍혀서 에러가 났을 때만 출력되도록, WARN 으로 올렸다.


log 파일에는 SQL문의 파라미터까지 출력되는데 Exceptoin 객체에는 파라미터 정보가 들어가 있지 않아서, 지금 프로젝트의 경우 에러가 났을때 에러 객체의 메시지와 Stack Trace를 DB에 저장하고 있지만 안타깝게도 SQL문의 파라미터 정보를 DB에서 조회해 볼수는 없다.


※ log4j의 출력을 DB에 저장하도록 설정할 수는 있다.

[참고] http://gnujava.com:8000/board/article_view.jsp?&article_no=3612&menu_cd=18&board_no=5&table_cd=EPAR01&table_no=01


설정한 maven 설정(pom.xml)은 다음과 같다.


<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-api</artifactId>
	<version>1.6.1</version>
	<scope>compile</scope>
</dependency>

<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-log4j12</artifactId>
	<version>1.6.1</version>
	<scope>compile</scope>
</dependency>

<dependency>
	<groupId>log4j</groupId>
	<artifactId>log4j</artifactId>
	<version>1.2.15</version>
	<scope>compile</scope>
	<exclusions>
		<exclusion>
			<groupId>com.sun.jdmk</groupId>
			<artifactId>jmxtools</artifactId>
		</exclusion>
		<exclusion>
			<groupId>com.sun.jmx</groupId>
			<artifactId>jmxri</artifactId>
		</exclusion>
		<exclusion>
			<groupId>javax.jms</groupId>
			<artifactId>jms</artifactId>
		</exclusion>
	</exclusions>
</dependency>

<dependency>
	<groupId>com.googlecode.log4jdbc</groupId>
	<artifactId>log4jdbc</artifactId>
	<version>1.2</version>
</dependency>


Spring 설정 파일

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://localhost:3306/myapp" />
		<property name="username" value="username" />
		<property name="password" value="password" />
	</bean>

	<bean id="dataSource-log4jdbc" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="net.sf.log4jdbc.DriverSpy" />
		<property name="url" value="jdbc:log4jdbc:mysql://localhost:3306/myapp" />
		<property name="username" value="username" />
		<property name="password" value="password" />
	</bean>

	<context:annotation-config />

	<tx:annotation-driven />

	<!-- define the SqlSessionFactory -->
	<!-- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> -->
	<bean id="sqlSessionFactory" class="com.myapp.home.config.mybatis.RefreshableSqlSessionFactoryBean"> <!-- 서버 재시작 없이 mybatis mapper xml 파일을 reloading 하는 클래스 -->
		<property name="dataSource" ref="dataSource-log4jdbc" />
		<property name="typeAliasesPackage" value="com.myapp.home" />
		<property name="configLocation" value="classpath:mybatis/mybatis-config.xml" />
		<property name="interval" value="5000" /> <!-- mapper xml 파일을 재로딩 하는 간격 -->
		<property name="mapperLocations" value="classpath:com/examples/home/**/dao/*Mapper.xml" />
	</bean>

	<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg ref="sqlSessionFactory" />
	</bean>

	<!-- scan for mappers and let them be autowired -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value="com.myapp.home" />
	</bean>

	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
		p:dataSource-ref="dataSource-log4jdbc" />

</beans>


log4jdbc를 활용하여 쿼리 로그 남기기


http://www.mimul.com/pebble/default/2008/10/24/1224847200000.html


Comments