파이널 프로젝트를 진행할 때, 오류 확인 시 너무 유용했던 log4j 라이브러리
: Log4Jdbc Log4j2 JDBC 4(org.bgee.log4jdbc-log4j2) 라이브러리 추가
<!-- SQL 로그에 사용할 log4jdbc-log4j2 라이브러리 -->
<!-- https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4.1 -->
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
<version>1.16</version>
</dependency>
: JDBC(DBCP) 설정이 있는 root-context.xml 파일 수정
<!-- SQL 로그를 위한 log4jdbc 라이브러리 관련 JDBC 설정(driverClassName, jdbcUrl 수정) -->
<!-- 원래 코드 -->
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/ooo"></property>
<property name="username" value="root"></property>
<property name="password" value="1234"></property>
</bean>
⬇️⬇️⬇️
<!-- 수정된 코드 -->
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>
<property name="jdbcUrl" value="jdbc:log4jdbc:mysql://localhost:3306/ooo"></property>
<property name="username" value="root"></property>
<property name="password" value="1234"></property>
</bean>
: src/main/resources - log4jdbc.log4j2.properties 파일 생성 및 프로퍼티 설정
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
: 2번 라인 DOCTYPE 의 log4j.dtd 앞에 주소 추가
<!-- 원래 코드 -->
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
⬇️⬇️⬇️
<!-- 수정된 코드 -->
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<!-- SQL Logger 추가 -->
<!-- jdbc.sqlonly : SQL 쿼리 문장에 대한 로그(전달인자 포함한 문장) -->
<logger name="jdbc.sqlonly" additivity="false">
<level value="info" />
<appender-ref ref="console" />
</logger>
<!-- jdbc.sqltiming : SQL 문장과 실행시키는데 소요된 시간(밀리초)에 대한 로그 -->
<logger name="jdbc.sqltiming" additivity="false">
<level value="warn" />
<appender-ref ref="console" />
</logger>
<!-- jdbc.audit : JDBC 호출 정보에 대한 로그(ResultSet 제외) => 내용 많음 -->
<logger name="jdbc.audit" additivity="false">
<level value="warn" />
<appender-ref ref="console" />
</logger>
<!-- jdbc.result : ResultSet 을 포함한 JDBC 호출 정보에 대한 로그 => 내용 많음 -->
<logger name="jdbc.result" additivity="false">
<level value="warn" />
<appender-ref ref="console" />
</logger>
<!-- jdbc.result : SELECT 실행 결과(데이터 테이블) 에 대한 로그 -->
<logger name="jdbc.resultsettable" additivity="false">
<level value="info" />
<appender-ref ref="console" />
</logger>
프로젝트에서 회원가입을 수행했을 때 로그 (4번째 회원)
member 테이블과 address 테이블에 잘 INSERT 되는 걸 볼 수 있다.
INFO : jdbc.sqlonly - SELECT IFNULL(MAX(member_idx),0) FROM member
INFO : jdbc.resultsettable -
|--------------------------|
|ifnull(max(member_idx),0) |
|--------------------------|
|3 |
|--------------------------|
INFO : jdbc.sqlonly - INSERT INTO member VALUES ( 3 + 1, 'winter', '12341234!', '김민정', 'f', 'winter@ooo.com', '010-0101-0101',
DATE_FORMAT(now(), '%y-%m-%d'), 'N' )
INFO : jdbc.sqlonly - SELECT IFNULL(MAX(address_idx),0) FROM address
INFO : jdbc.resultsettable -
|---------------------------|
|ifnull(max(address_idx),0) |
|---------------------------|
|3 |
|---------------------------|
INFO : jdbc.sqlonly - INSERT INTO address VALUES ( 3 + 1, 3 + 1, '01010', '경기도 화성시 ----------', '---동 ---호' )