(Spring) logback - 설정

lgw2236·2023년 5월 17일
0

개발기록

목록 보기
7/8

logback, sql log 출력 및 logfile로 저장방법


side project를 세팅중에 sql log 를 console에 출력,로그 관리 logback 설정을 하다가
가이드를 하나 기록해 놓아야 겠다고 생각이 들어 포스팅 하게 되었다.


프로젝트 환경

  • Build : Gradle
  • Spring Boot : 2.7.11
  • IDE : STS ( Eclipse )

본 세팅 방법은 Spring Boot 2.7.11 버젼, Gradle 에 맞춰서 진행 되었습니다.

STEP 0.

build.gradle에 log4jdbc implementation추가

implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16'

STEP 1.

application.properties에 해당코드 추가

# log 설정 
logging.level.root=info

# DB 설정 : log4jdbc
spring.datasource.url=jdbc:log4jdbc:mysql://localhost:port/mydb?serverTimezone=UTC&characterEncoding=UTF-8
spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.username=####
spring.datasource.password=####

STEP 2.

2-1. log4jdbc.log4j2.properties 생성
-> 해당 파일 경로는 resources 바로 아래

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength=0

2.2 logback-local.properties 생성 : log 물리파일생성 경로 & 생성 파일 이름
-> 이것도 파일 경로는 resources 바로 아래

log.config.path=C:/LGW_logs/local

log.config.filename=local_lgw_log
log.config.environment=local

log.jdbc.level=DEBUG

2.3
logback-spring.xml 생성
-> 파일 경로 resources 바로 아래

<?xml version="1.0" encoding="UTF-8"?> 
	<!-- 60초마다 설정 파일의 변경을 확인 하여 변경시 갱신 --> 
	<configuration scan="true" scanPeriod="60 seconds"> 
	<!--springProfile 태그를 사용하면 logback 설정파일에서 복수개의 프로파일을 설정할 수 있다.--> 
	<springProfile name="local"> 
		<property resource="logback-local.properties"/> 
	</springProfile> 
	<springProfile name="dev"> 
		<property resource="logback-dev.properties"/> 
	</springProfile> 
	<!--Environment 내의 프로퍼티들을 개별적으로 설정할 수도 있다.--> 
	
	<springProperty scope="context" name="LOG_LEVEL" source="logging.level.root"/> 
	
	<!-- log file path --> 
	<property name="LOG_PATH" value="${log.config.path}"/>
	 
	<!-- log file name --> 
	<property name="LOG_FILE_NAME" value="${log.config.filename}"/>
	 
	<!-- err log file name --> 
	<property name="ERR_LOG_FILE_NAME" value="err_log"/>
	 
	<!-- pattern --> 
	<property name="LOG_PATTERN" value="%-5level %d{yy-MM-dd HH:mm:ss}[%thread] [%logger{0}:%line] - %msg%n"/>
	
	 <!-- Console Appender --> 
	 <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> 
	 	<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 
	 		<pattern>${LOG_PATTERN}</pattern> 
	 	</encoder> 
	 </appender> 
	 
	 <!-- File Appender -->
	 <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<!-- 파일경로 설정 --> 
		<file>${LOG_PATH}/${LOG_FILE_NAME}.log</file> 
		
		<!-- 출력패턴 설정--> 
		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 
			<pattern>${LOG_PATTERN}</pattern> 
	  </encoder> 
	  
	  <!-- Rolling 정책 --> 
	  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
	  	<!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 --> 
		<fileNamePattern>${LOG_PATH}/${LOG_FILE_NAME}.%d{yyyy-MM-dd}_%i.log</fileNamePattern> 
		<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> 
			<!-- 파일당 최고 용량 kb, mb, gb --> 
			<maxFileSize>10MB</maxFileSize> 
		</timeBasedFileNamingAndTriggeringPolicy> 
		
		<!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거--> 
		<maxHistory>30</maxHistory> 
		<!--<MinIndex>1</MinIndex> 
		<MaxIndex>10</MaxIndex>--> 
		
		</rollingPolicy>
	 </appender>
	 
	  <!-- 에러의 경우 파일에 로그 처리 --> 
	  <appender name="Error" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
	  	<filter class="ch.qos.logback.classic.filter.LevelFilter">
	  		<level>error</level> 
	  		<onMatch>ACCEPT</onMatch> 
	  		<onMismatch>DENY</onMismatch> 
	  	</filter> 
	  	<file>${LOG_PATH}/${ERR_LOG_FILE_NAME}.log</file> 
	  	<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 
	  		<pattern>${LOG_PATTERN}</pattern> 
	  	</encoder> 
	  	
	  	<!-- Rolling 정책 -->
	  	 <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
	  	 
			<!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 --> 
			<fileNamePattern>${LOG_PATH}/${ERR_LOG_FILE_NAME}.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
			 
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<!-- 파일당 최고 용량 kb, mb, gb -->
				<maxFileSize>10MB</maxFileSize> 
			</timeBasedFileNamingAndTriggeringPolicy>
			 <!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거--> 
			 <maxHistory>60</maxHistory> 
		</rollingPolicy> 
	</appender> 
	
	<!-- root레벨 설정 --> 
	<root level="${LOG_LEVEL}"> 
		<appender-ref ref="CONSOLE"/> 
		<appender-ref ref="FILE"/> 
		<appender-ref ref="Error"/> 
	</root> 
	
	<!-- 특정패키지 로깅레벨 설정 --> 
	<logger name="org.apache.ibatis" level="DEBUG" additivity="false"> 
		<appender-ref ref="CONSOLE"/> <appender-ref ref="FILE"/> 
		<appender-ref ref="Error"/> 
	</logger> 
	
	<!-- log4jdbc 옵션 설정 --> 
	<logger name="jdbc" level="OFF"/> 
	
	<!-- 커넥션 open close 이벤트를 로그로 남긴다. --> 
	<logger name="jdbc.connection" level="OFF"/> 
	
	<!-- SQL문만을 로그로 남기며, PreparedStatement일 경우 관련된 argument 값으로 대체된 SQL문이 보여진다. -->
	<logger name="jdbc.sqlonly" level="OFF"/> 
	
	<!-- SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함한다. --> 
	<logger name="jdbc.sqltiming" level="DEBUG"/> 
	
	<!-- ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남긴다. 많은 양의 로그가 생성되므로 특별히 JDBC 문제를 추적해야 할 필요가 있는 경우를 제외하고는 사용을 권장하지 않는다. --> 
	<logger name="jdbc.audit" level="OFF"/> 
	
	<!-- ResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남기므로 매우 방대한 양의 로그가 생성된다. --> 
	<logger name="jdbc.resultset" level="OFF"/> <!-- SQL 결과 조회된 데이터의 table을 로그로 남긴다. --> 
	<logger name="jdbc.resultsettable" level="OFF"/>

</configuration>

STEP 3.

VM - springProfile 설정

logback-spring.xml 에서 
springProfile이 local 일때 logback-local.properties 해당 설정을
참조하도록 세팅 해놓았기 때문에 해당 프로퍼티를 바라볼 수 있도록
springProfile 을 세팅 해주어야 한다.

-Dspring.profiles.active=local 해당 설정을 VM arguments에
추가해주어 springProfile을 설정해준다.

STEP END.

콘솔에도 SQL 로그가 잘 찍힌것을 확인할 수 있다.

사진과 같이 출력된 로그가 잘 저장된 모습을 볼 수 있다.

GOOD!

profile
어제보다 오늘 더

0개의 댓글