프로젝트 구조

 

build.gradle에 해당코드 추가

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

 

application.properties에 해당코드 추가
logging.level.root=info

spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:mysql://localhost:3306/TB_BOARD?serverTimezone=UTC&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=1234

 

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

 

logback-local.properties
log.config.path=/logs/local
log.config.filename=local_log

 

logback-spring.xml
<?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>

 

MainController에 test코드 추가
//메인화면
@GetMapping(Url.MAIN.MAIN)
  public String main() {
  log.info("test");
  log.warn("test");
  log.error("test");
  return Url.MAIN.MAIN_JSP;
}

 

메인접속시 쿼리 로그와 로그파일이 남는것을 확인할수 있습니다.

 

 

 

 

- 다음 포스팅에서는 게시판 삭제기능을 개발해서 적용 해보겠습니다. 감사합니다.

복사했습니다!