IT/etc

[MyBatis/JAVA/Spring/Maven] log4를 사용하여 SQL로그 출력하기

@욕심쟁이 2021. 1. 26. 02:12
반응형

1. 의존성 추가(pom.xml) : 보통 기본설정으로 다들어가있음

<!-- https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4 -->
<dependency>
  <groupId>org.bgee.log4jdbc-log4j2</groupId>
  <artifactId>log4jdbc-log4j2-jdbc4</artifactId>
  <version>1.16</version>
</dependency>

 

2. 데이터베이스 접속 설정 수정(root-context.xml or dataSource-context.xml)
 - com.mysql.cj.jdbc.Driver를 net.sf.log4jdbc.sql.jdbcapi.DriverSpy으로 수정

 - jdbc:mysql : 주소에 jdbc:log4jdbc:mysql:주소 log4jdbc추가

 - jdbc:oracle: 주소에 jdbc:log4jdbc:oracle:주소 log4jdbc추가

 - jdbc:sqlserver: 주소에 jdbc:log4jdbc:sqlserver:주소 log4jdbc추가

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!-- 	<property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
       <property name="url" value="jdbc:mysql://127.0.0.1:3306/mess?allowPublicKeyRetrieval=true&amp;useSSL=false&amp;serverTimezone=UTC" /> -->
        <property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy" />
        <property name="url" value="jdbc:log4jdbc:mysql:주소" />
        <property name="username" value="username"></property>
        <property name="password" value="password"></property>
 </bean>  

 

3. properties 파일 신규 생성(log4jdbc.log4j2.properties)

 - log4jdbc.log4j2.properties 를 생성

 - 위치는 log4j.xml이 있는 /src/main/resources에 생성

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

 

4. log4j.xml 수정(log4j.xml)

 - log4j.xml에 아래코드 추가(어떤 로그를 출력할지)

 - sql logger추가

<?xml version="1.0" encoding="UTF-8"?>
<!-- <!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd"> -->
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

	<!-- Appenders -->
	<appender name="console" class="org.apache.log4j.ConsoleAppender">
		<param name="Target" value="System.out" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%-5p: %c - %m%n" />
		</layout>
	</appender>
	
	<!-- Application Loggers -->
	<logger name="com.Travel.go">
		<level value="info" />
	</logger>
	
	<!-- 3rdparty Loggers -->
	<logger name="org.springframework.core">
		<level value="info" />
	</logger>
	
	<logger name="org.springframework.beans">
		<level value="info" />
	</logger>
	
	<logger name="org.springframework.context">
		<level value="info" />
	</logger>

	<logger name="org.springframework.web">
		<level value="info" />
	</logger>
	
	<!-- SQL Logger -->

	<logger name="jdbc.sqltiming" additivity="false">
		<level value="warn" />
		<appender-ref ref="console"/> 
	</logger>
	<logger name="jdbc.sqlonly" additivity="false"> 
		<level value="info"/> 
		<appender-ref ref="console"/> 
	</logger>
	<logger name="jdbc.audit" additivity="false"> 
		<level value="warn"/>  
		<appender-ref ref="console"/> 
	</logger> 
	<logger name="jdbc.resultset" additivity="false">
		<level value="warn" />
		<appender-ref ref="console"/> 
	</logger>
	<logger name="jdbc.resultsettable" additivity="false"> 
		<level value="info"/>  
		<appender-ref ref="console"/> 
	</logger> 


	<!-- Root Logger -->
	<root>
		<priority value="INFO" />
		<appender-ref ref="console" />
	</root>
	
</log4j:configuration>

 

5. 결과

 

#로그 레벨 정리

 - 로그 레벨은 다음과 같다. (FATAL > ERROR > WARN > INFO > DEBUG > TRACE)

레벨 정의
FATAL 심각한 문제를 일으킬 수 있는 문제를 출력
(일반적으로는 어플리케이션에서는 사용할 일이 없음)
ERROR 요청을 처리하는중 문제가 발생한 상태를 출력
=> 일반적인 에러로 처리가 반드시 필요하는 문제를 출력
WARN 경고성 메세지로, 처리 가능한 문제이지만,
향후 시스템 에러의 원인이 될 수 있는 메세지를 출력
 INFO 로그인, 상태변경과 같은 정보성 데이터를 출력
DEBUG  debug을 위한 용도로, 일반 정보를 상세하게 출력
=> 개발시 디버그 용도로 사용한 메시지를 나타냄.
TRACE 디버그 레벨이 너무 광범위한 것을 해결하기 위해서 좀더 상세한 상태를 출력

 =>  기본적으로 rootlogger의 레벨이 'WARN'으로 설정되어 있습니다.

       레벨을 'WARN' 으로 설정하면 그 이전 레벨('DEBUG','INFO') 등을 출력하지 않습니다.

#로그 이름 정리

이름 정의
jdbc.sqlonly SQL 쿼리 문장만 로그로 남김
PreparedStatement일 경우 관련된 argument 값으로 대체된 
SQL문이 보여짐
jdbc.sqltiming SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함
 jdbc.audit ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남긴다. 많은 양의 로그가 생성되므로 특별히  JDBC 문제를 추적해야 할 필요가 있는 경우를 제외하고는 사용을 권장하지 않음
 jdbc.resultset ResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남기므로 매우 방대한 양의 로그가 생성
jdbc.resultsettable SQL 결과 조회된 데이터의 table을 로그로 남김

 

반응형