#9 : 로깅
스프링부트는 기본적으로 logback이라는 로깅 툴을 사용하여 로그 출력, STS의 콘솔에 출력되는 문자열과 서버에서 sbb.log 파일에 출력되면 문자열이 모두 그에 해당한다.
01. 서버 로그의 문제점
- 서비스를 재 실행할 경우 이전 로그가 삭제된다. (stop.sh을 하고 start.sh을 실행할 경우)
- 로그 파일이 쌓일수록 로그파일의 사이즈가 커지며 무한대로 증가할 수 있다.
- 로그의 시간이 시스템 시간이 아닌 UTC시간으로 출력된다.
02. 서버 로그 분리
* application-prod.properties 수정
# logging
logging.logback.rollingpolicy.max-history=30
logging.logback.rollingpolicy.max-file-size=100MB
logging.file.name=logs/sbb.log
logging.logback.rollingpolicy.file-name-pattern=${LOG_FILE}.%d{yyyy-MM-dd}-%i.log
logging.pattern.dateformat=yyyy-MM-dd HH:mm:ss.SSS,Asia/Seoul
ㄴ> logging.logback.rollingpolicy.max-history : 로그 파일을 유지할 기간(일수)을 설정한다.
ㄴ> logging.logback.rollongpolicy.max-file-size : 로그 파일의 한 개의 최대 사이즈를 설정한다.
ㄴ> logging.file.name : 로그 파일의 이름을 설정한다. logs/sbb.log는 logs 디렉토리의 하위에 sbb.log하는 이름으로 로그파일을 생성하라는 의미이다.
ㄴ> logging.logback.rollingpolicy.file-name-pattern : 로그 파일의 사이즈가 설정한 용량을 초과하거나 날짜가 변경될 경우 명명할 로그파일의 이름에 대한 설정이다.
ㄴ>logging.pattern.dateformat : 로그 출력 시 출력하는 날짜와 시간에 대한 포맷과 타임존을 설정한다. 타임존을 설정하지 않을 경우 UTC 시간을 기준으로 출력한다.
배포파일을 다시 생성하여 업로드
03. start.sh 수정
#!/bin/bash
JAR=sbb-0.0.3.jar
LOG=/dev/null
export spring_profiles_active=prod
nohup java -jar $JAR > $LOG 2>&1 &
* 로깅 설정을 통해 logs 디렉토리 하위에 로그파일이 생성되도록 설정했기 때문에 /dev/null로 지정하여 콘솔 출력이 무시되도록 한다.
- 기존로그 삭제
ubuntu@jumpto:~/sbb$ rm sbb.log
- 재시작
ubuntu@jumpto:~/sbb$ stop.sh
ubuntu@jumpto:~/sbb$ start.sh
- 로그 생성 확인
ubuntu@jumpto:~/sbb/logs$ ls
sbb.log
04. 사용자 로그
사용자가 직접 코드를 작성하여 로그를 출력 가능하다.
- 질문 목록 조회 시 GET으로 요청되는 page, kw 파라미터의 입력값을 로그로 출력하기
* QuestionController.java 수정
@Slf4j
@Controller
@RequestMapping("/question")
@RequiredArgsConstructor
public class QuestionController {
private final QuestionService questionService;
private final UserService userService;
@GetMapping("/list")
public String list(Model model,
@RequestParam(value="page", defaultValue = "0") int page,
@RequestParam(value = "kw", defaultValue = "") String kw) {
log.info("page:{}, kw:{}", page, kw);
Page<Question> paging = this.questionService.getList(page, kw);
//1부터 시작하도록
int nowPage = paging.getPageable().getPageNumber()+1;
int startPage = Math.max(nowPage-4,1);
int endPage = Math.min(nowPage+5,paging.getTotalPages());
model.addAttribute("paging",paging);
model.addAttribute("nowPage",nowPage);
model.addAttribute("startPage",startPage);
model.addAttribute("endPage",endPage);
model.addAttribute("kw",kw);
return "question_list";
}
ㄴ> @Slf4j : log객체 사용 가능, debug, error 등의 로그를 출력 가능
ㄴ> 로그 레벨 (로그는 설정한 레벨 이상의 로그만 출력된다.)
* 1단계 trace : debug보다 훨씬 상세한 정보를 나타낼 경우에 사용
* 2단계 debug : 디버깅 목적으로 사용
* 3단계 info : 일반 정보를 출력할 목적으로 사용
* 4단계 warn : 경고 정보를 출력할 목적으로 (작은 문제) 사용
* 5단계 error : 오류 정보를 출력할 목적으로(큰 문제) 사용
* 6단계 fatal : 아주 심각한 문제를 출력할 목적으로 사용
로그는 설정한 레벨 이상의 로그만 출력된다. 예를 들어 logging.level.root=info로 설정 시 trace와 debug는 제외하고 나머지 레벨의 로그가 출력된다. info가 기본 값이다.
'T-I-L > [책] 요약&정리' 카테고리의 다른 글
| [점프 투 스프링부트] 3장 SBB 서비스 개발(SSL) - 2023. 09. 20. (0) | 2023.09.22 |
|---|---|
| [점프 투 스프링부트] 3장 SBB 서비스 개발(도메인) - 2023. 09. 20. (0) | 2023.09.21 |
| [점프 투 스프링부트] 3장 SBB 서비스 개발(NGINX) - 2023. 09. 19. (0) | 2023.09.19 |
| [점프 투 스프링부트] 3장 SBB 서비스 개발(개발과 서버 환경 분리) - 2023. 09. 15. (0) | 2023.09.15 |
| [점프 투 스프링부트] 3장 SBB 서비스 개발(서버 스크립트) - 2023. 09. 14. (0) | 2023.09.14 |
