dev/Spring

[Spring] log4jdbc-log4j2 설정

dev_Step 2022. 8. 3. 16:16

DB 작업간에 에러 또는 정보를 얻기 위하여 log 설정을 한다.

우선 가장 먼저 해야 할 것은

 

1. pom.xml에 Dependency 를 추가해 준다.

<!-- 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 에서  dataSource 설정을 변경해 준다.

  >> driverClassName / url 이 조금 수정되었다.

<변경 전>
<!-- Root Context: defines shared resources visible to all other web components -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
	<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
	<property name="url" value="jdbc:mysql://localhost:3306/DB-NAME"/>
	<property name="username" value=" DB ID"/>
	<property name="password" value=" DB PWD"/>
</bean>
    
   
<변경 후 > 
<!-- Root Context: defines shared resources visible to all other web components -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
	<property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"/>
	<property name="url" value="jdbc:log4jdbc:mysql://localhost:3306/DB-NAME"/>
	<property name="username" value=" DB ID"/>
	<property name="password" value=" DB PWD"/>
</bean>

3.  log4jdbc-log4j2 설정 파일을 등록한다.

 >> log4jdbc.log4j2.properties

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

 >> logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>
	<include resource="org/springframework/boot/logging/logback/base.xml"/>
	
	<!-- log4jdbc-log4j2 -->
	<logger name="jdbc.sqlonly" level="INFO"/>
	<logger name="jdbc.sqltiming" level="INFO"/>
	<logger name="jdbc.audit" level="WARN"/>
	<logger name="jdbc.resultset" level="INFO"/>
	<logger name="jdbc.resultsettable" level="INFO"/>
	<logger name="jdbc.connection" level="INFO"/>
</configuration>

 

logback.xml 작성 방법

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>
	<appender name="사용할 이름" class="ch.qos.logback.core.ConsoleAppender">
    	<layout class="ch.qos.logback.classic.PatternLayout">
        	<Pattern> 사용할 패턴을 작성 </Pattern>
        </layout>
    </appender>
    
    <appender name="사용할 이름" class="ch.qos.logback.core.rolling.RollingFileAppender">
    	<file> 타깃이 될 파일명(로그파일이겠찌) </file>
        
        // 	rollover 발생 시 RollingFileAppender의 행동  
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        
        	// TimeBasedRollingPolicy-> 시간에 기반하여 rollover 정책을 정의
            // rollover 뿐만아니라 Trigger에 대한 책임을 짐(RollingPolicy, TriggeringPolicy 상속)
            <fileNamePattern> 
            	
                //%d 이후의 yyyy-mm-dd / yyyy-mm 에 따라서 rollover 시기가 달라짐
                //해당 기준에 따라 매일 자정 혹은 매달 rollover됨
            	경로.%d{yyyy-MM-dd}.%i.log(%i는 index로 토큰으로 사용됨) 
                
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            	<maxFileSize>
                 	파일 한개당 최대 SIZE를 지정해줌
                </maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
                
                
              // 최대 log 파일이 30개 까지 가질수 있으며 그 후는 오래된 파일 삭제
             <maxHistory>30</maxHistory>
            
            <!--
            // 최대 log 파일의 Size는 3GB를 넘지 못함
     		 <totalSizeCap>3GB</totalSizeCap>
            -->
            
        </rollingPolicy>
    </appender>

	<logger name="org.springframework.web">
		<level value="info" />
	</logger>

	<!-- Root Logger -->
	<root>
		<priority value="info" />
		<appender-ref ref="console" />
	</root>


======
<logger name="jdbc.sqlonly" level="INFO"/>
<logger name="jdbc.sqltiming" level="INFO"/>
<logger name="jdbc.audit" level="WARN"/>
<logger name="jdbc.resultset" level="INFO"/>
<logger name="jdbc.resultsettable" level="INFO"/>
<logger name="jdbc.connection" level="INFO"/>

</configuration>
class 이름 설명
ch.qos.logback.core.ConsoleAppender console에 로그를 찍기 위해 사용하는 클래스
ch.qos.logback.core.FileAppender FILE에 로그를 남기기 위하여 사용하는 클래스
ch.qos.logback.core.rolling.RollingFileAppender 조건에 따라 파일에 출력
ch.qos.logback.classic.net.SMTPAppender 로그를 메일에 보내기 위해 사용하는 클래스
ch.qos.logback.classic.db.DBAppender DB에 로그를 찍기 위하여 사용하는 클래스

 

Pattern

%d : 로그 기록 시간

%-5level : %level만 사용해도되며, -5 는 5글자 고정으로 출력을 위한 숫자

%logger : logger 이름으로, %logger{20}과 같이 사용할 수 있으며 {20}을 붙이면 최대 20자리로 출력

%replace : replace로 내용을 변경할 수 있음

%msg : 메시지 출력 

%n : 줄바꿈

 

logger

logger는 name에 대상을 지정하고 Level을 지정한다 

Level은  TRACE>DEBUG>INFO>WARN>ERROR>OFF가 있으며

level="info" 로 설정되어 있다면 그 이하의 WARN, ERROR, OFF의 로그는 나오지 않으며

TRACE, DEBUG, INFO 의 로그만 찍히게 된다.

 

additivity : Default는 True이며, False로 지정할 경우 logger에서 설정한 name의 하위 로그는 찍히지 않음

 

<root>

 기준에 되는 것으로 root에서 level을 지정하면 , 해당 level을 기준으로 로그가 찍힌다.

  위에서 지정한 level을 무시하고 Root의 level을 기준으로함

</root>

 

jdbc.sqlonly  SQL문을 로그로 남깁니다.
jdbc.sqltiming SQL문과 수행된 시간을 로그로 남깁니다.
jdbc.resultsettable SQL 결과 조회된 데이터를 table 형식으로 만들어줍니다.
jdbc.audit ResultSet을 제외한 JDBC 호출 정보를 로그로 남김
jdbc.resultset ResultSet을 포함한 JDBC 호출 정보를 로그로 남김

<출처 : https://frozenpond.tistory.com/86>

========================================================================================