본문 바로가기

Spring/spring boot

Spring boot 로그 설정 및 출력 방법- logback 설정하기 - 삽질중인 개발자

반응형

- Spring boot 로그 설정-

스프링 부트의 기본 로그 툴은 Logback이다. 

로그 툴을 사용하는 이유는 System.out.print() 를 사용하게 되면 IO리소스를 많이 잡아먹어 속도가 느리며

후에 로그를 파일로 남겨서 확인해야 하기 때문이다.

 

로그를 잘 남겨놔야지 개발 단계 혹은 운영 단계에서 문제가 발생시 쉽게 잡아 낼 수 있다. ( 특히 SQL 쿼리는 눈에 보여야지 디버깅하기 쉽다. ) 

 

1. pom.xml 에 추가

spring starter에 포함 안되어 있는 로깅시 쿼리를 풀로 보여줄 수 있게 해주는 라이브러리를 추가한다.

		<!-- log4jdbc -->
		<dependency>
		    <groupId>org.bgee.log4jdbc-log4j2</groupId>
		    <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
		    <version>1.16</version>
		</dependency>    

 

2. log4jdbc.log4j2.properties 생성

log4jdbc.log4j2.properties 파일을 classpath 에 생성 후 아래의 설정을 복붙 한다.

 

 

 

 

 

 

 

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

log4jdbc.dump.sql.maxlinelength=0

 

 

3. properties에 datasource를 다음과 같이 변경한다.

spring.datasource.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:mariadb://localhost:3306/project?characterEncoding=UTF-8&passwordCharacterEncoding=utf8
spring.datasource.username=demo
spring.datasource.password=123456

spring.datasource.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy

spring.datasource.url=jdbc:log4jdbc:mariadb://localhost:3306/project?characterEncoding=UTF-8&passwordCharacterEncoding=utf8

 

이 부분을 변경해야지 SQL 로그에 ? 가 파라미터로 변경되어 나온다.

 

4. application.properties 에 로깅 관련 설정을 해준다.

 

만약 JPA을 사용 중이라면 JPA에 log 옵션은 꺼야지 중복으로 안 나온다.

 

properties 설정 방법

logging.level.org.springframework.web=debug		
logging.level.sql=error
# hibernate에서 생성하는 SQL 로그 끄기
logging.level.org.hibernate.SQL=off

logging.level.jdbc=error
logging.level.jdbc.sqlonly=debug

#max-history 설정 안하면 디폴트가 30이라 30일 이후의 로그는 자동 삭제된다. 필수로 해야함.
logging.file.max-history=9999999
logging.file.max-size=100MB
logging.file.name=${user.home}/logs/product.log

#  로그 패턴 설정
logging.pattern.console=%-5level %d{yyyy-MM-dd HH:mm:ss}[%thread] [%F - %M] [%logger{0}:%line] - %msg%n
logging.pattern.file= %-5level %d{yyyy-MM-dd HH:mm:ss}[%thread] [%F - %M] [%logger{0}:%line] - %msg%n

 

yml 설정 방법

logging:
  level:
    org.springframework.web : debug
    sql: error
    jdbc: off
    jdbc.sqlonly: debug 
  file : ${user.home}/logs/product.log
  file.max-history: 9999999
  file.max-size : 100MB

 

주로 사용하는 옵션을 써둔 것이다.

 

${user.home} 은 계정의 홈 디렉토리이다. (정상 작동을 안 하면 지우자)

 

logging.file.max-history를 설정을 안하면 디폴트가 30일이라 30일이 넘은 로그는 삭제한다. ( 운영 중에 삭제되면 큰일이니 꼭 설정을 해야 한다. )

logging.file.max-size 는 로깅 파일이 설정한 용량이 넘어가면 압축해서 저장한다. 기본 값은 설정한_파일명.gz 으로 압축한다.

logging.fifle.name 은 저장될 파일 명이다 설정을 안 하면 spring.log로 서버가 실행된 폴더에 만든다. 이 부분은 알아서 잘 설정하면 된다.

 

로그 패턴 설정은 보기 편하게 알아서 수정하면 된다. 파일에 남기는 로그와 콘솔에 남기는 로그가 각각 세팅이 된다.

 

[ 로깅 패턴 ]

 

%-5level : 로그 레벨, -5는 출력의 고정폭 값(5글자) (INFO, ERROR, DEBUG , 기타 등등이다.)

%d{날짜 형식 포맷} : 로그 기록시간 %d{yyyy-MM-dd HH:mm:ss} 을 사용하면 된다.

%thread : 현재 Thread 명 

%F : 로깅을 발생시킨 파일 명
%M : 로깅을 발생시킨 메소드 명

%logger{length} : Logger name을 축약할 수 있다. length는 최대 자릿수이다 (0 = 무제한)

%line : 로깅이 발생된 라인 넘버
%msg : - 로그 메시지

%n : 줄바꿈(new line) 

 

이 외에도 여러 가지가 있다. ( http://logback.qos.ch/manual/layouts.html )

 

 

 

5. 로그 확인

 

jpa에서 생성한 쿼리는 한 줄로 출력이 되는데 Mapper로 짜인 쿼리는 매퍼에 쓰여 있는 것처럼 나온다. ( 이 부분은 설정은 추후 업데이트 ) 

 

6. JAVA 로직에서 로그 출력 방법

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import lombok.extern.slf4j.Slf4j;



@Controller
@RequestMapping("/")
@Slf4j
public class MainController {
	
	@GetMapping("")
	public String main(Model model) {
		log.info("INFO");
		log.debug("DEBUG");
		log.warn("WARN");
		log.error("ERROR");
		return "main";
	}
	
}

 

Logger 변수를 선언하는 방식은 LoggerFactory를 사용하는 방법도 있고 어노테이션을 붙이는 방법도 있는데 어노테이션이 더 편한 거 같다.

@Slf4j

어노테이션을 컨트롤러에 붙이면 log라는 변수가 생긴다.

log 변수를 메소드 안에서 알맞게 사용해주면 된다.

 

나머지 옵션은 다른 블로그에 잘 설명되어 있으니 참고하자

 

 


 

Spring Boot @Slf4j 사용법

 

Spring boot logging - @Slf4j 어노테이션 사용법 - 삽질중인 개발자

개발을 하거나 운영을 하는 상황에서 LOGGING 은 아주 중요하다. Spring boot에서는 로그를 남기는 방법이 많이 있다. 그중 가장 편하게 사용되는 @Slf4j 어노테이션을 알아보자. SLF4J 란? 로깅에 대한

programmer93.tistory.com

 

 

 

 

반응형