보통 log를 출력하는데 log4jdbc를 사용하는데
이 log 출력은
일반적으로 사용하는데는 큰 문제가없는데
쿼리를 출력하는 과정이 문제이다
SELECT * FROM table WHERE e_id = ?
라는 쿼리문이 있다면
콘솔에는 그대로 ?로 명시되어있는 쿼리문을 그대로 출력하고
그 아래에 파라미터를 따로 번호대로 출력하는게 문제이다.
짧은 쿼리문이면 상관이 없지만
파라미터가 수십개로 넘어간다면 직관적으로 확인이 불가능하고 파악하기도 굉장히 힘들다.
?로 출력되는 위치에 삽입된 파라미터가 출력되는것을 보기위해
' log4jdbc-remix ' 를 사용해보자.
- pom.xml 설정
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>
( '0.2.7 버전' 을 사용하는 이유는 안정적인 버전이라 나와있어서 그렇다. )
- context-datasource.xml 설정
<!-- oracle -->
<bean id="dataSourceSpied" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${Globals.DriverClassName}"/>
<property name="url" value="${Globals.Url}" />
<property name="username" value="${Globals.UserName}"/>
<property name="password" value="${Globals.Password}"/>
</bean>
<bean id="dataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource">
<constructor-arg ref="dataSourceSpied" />
<property name="logFormatter">
<bean class="net.sf.log4jdbc.tools.Log4JdbcCustomFormatter">
<property name="loggingType" value="MULTI_LINE" />
<property name="sqlPrefix" value="SQL:::" />
</bean>
</property>
</bean>
기존에 있던 dataSource 소스 부분 아래에 새로 추가해주고 위와같이 그냥 선언 해주면 된다.
* 여기서 가끔 class를 찾지 못하거나 그냥 알수없는 에러가 발생하는 경우가 있는데 그경우 jar파일이 제대로 pom.xml을 통해서 설치가 안된것이니 maven을 clean하고 재 install해주자.
* 그리고 블로그에있는것을 긁어다가 붙어넣기 할 경우 가끔 더블쿼터가 에러가 발생하는데 그건 다시 직접 더블쿼터로 감싸주면 해결된다.
- log4j2.xml 설정
<?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 설정)
출처 : https://jinyoung8806.github.io/spring/spring-sql-logging/
(저리 jdbc.sqlonly가 있는데 왜 log4jdbc-remix 이걸 쓰는지는 아직 잘 모르겠다...)
이런식으로 위에서 ?로 출력되는 부분이 파라미터가 채워진 상태로 출력된다.
참고 : https://code.google.com/archive/p/log4jdbc-remix/
출처 : https://mine-it-record.tistory.com/203
'백엔드 개발 놀이터 > Spring' 카테고리의 다른 글
[Lombok] 롬복 설치 및 사용법 (0) | 2020.04.08 |
---|---|
이클립스(Eclipse)에 SVN(SubVersion) 설치하기 (0) | 2020.04.08 |
[spring] Log4j2 could not find a logging implementation (0) | 2020.04.07 |
WARNING: [SetContextPropertiesRule]{Context} Setting property 'source' to 'org.eclipse.jst.jee.server 문제 (0) | 2020.04.07 |
Springboot Http/Https 사용하기(멀티 커넥트) (0) | 2020.01.23 |