[Spring] log4jdbc-log4j2 설정
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>
========================================================================================