- 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 > spring boot' 카테고리의 다른 글
RestTemplate generic response type 매핑 방법 - 삽질중인 개발자 (0) | 2020.06.28 |
---|---|
@ConfigurationProperties 사용법 - 삽질중인 개발자 (0) | 2020.06.01 |
spring boot static 파일 다운로드 구현 - 삽질중인 개발자 (0) | 2020.04.05 |
Spring boot oracle db 연동 , spring boot oracle jdbc 설정 - 삽질중인 개발자 (0) | 2019.12.16 |
스프링 부트 JSP 연동, Spring boot MVC 설정 방법 - 삽질중인 개발자 (0) | 2019.12.16 |