로그(log)란?
프로그램 또는 시스템에서 발생하는 이벤트, 정보, 상태, 오류 등을 기록한 것을 말하고,
이러한 로그를 생성하고 저장하는 것을 로깅(logging)이라고 한다.
로그는 프로그램의 동작을 추적해 문제를 해겨하거나 성능을 분석하기 위한 목적으로 활용된다.
스프링부트는 기본적으로 로그백(logback)이라는 로깅 도구를 사용하여 로그를 관리한다.
현재 서버에 생성되는 로그파일(sbb.log)에는 몇 가지 문제가 있다.
1. 서비스를 다시 실행할 경우 이전 로그가 삭제된다.
2. 로그가 쌓일수록 파일의 용량이 커지며 무한대로 증가한다.
3. 로그 시간이 시스템 시간이 아닌 UTC시간으로 출력된다.
서버 로그 분리하기
위의 문제를 해결하려면 개발 환경의 로그와 서버 환경의 로그를 분리해야 한다.
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=30
-로그 파일을 유지할 기간(일)을 설정한다. 30일만 유지하도록 지정.
logging.logback.rollingpolicy.max-file-size=100MB
-로그파일 1개의 최대용량을 설정한다. 100MB로 설정.
logging.file.name=logs/sbb.log
-로그 파일의 이름을 설정한다. 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
-로그 출력시 출력되는 날자와 시간의 형식을 지정한다.
이처럼 수정 후 빌드 버전(sbb-0.0.3.jar)을 변경하여 배포 파일을 새로 작성하여 서버에 업로드하자.
아래 글 참고
build.gradle
...
group = 'com.mysite'
version = '0.0.3'
...
위처럼 수정한 다음 build.gradle 우클릭 [Gradle -> Refresh...]
[Run -> Run Configuration]클릭 후 Gradle Task의 'sbb' Run하기
sbb-0.0.3.jar 파일이 생성된 것을 확인
파일질라에서 서버로 업로드하기
서버에서 start.sh 변경하기
1. 로깅 설정을 변경했으므로 서버에서 적용하기 위해 mobaXterm으로 돌아가 파일을 수정해보자.
sbb-0.0.3.jar가 있는 것도 확인
#!/bin/bash
JAR=sbb-0.0.3.jar
LOG=/dev/null
nohup java -Dspring.profiles.active=prod -jar $JAR > $LOG 2>&1 &
nano start.sh 입력 후 위처럼 파일 수정하기. 수정 후에는 Ctrl+O -> Ctrl+X
2. 기존의 로그는 더 이상 필요하지 않으므로 삭제하기.
ubuntu@jumpto:~/sbb$ rm sbb.log
3. SBB 서비스를 다음과 같이 재시작하기
ubuntu@jumpto:~/sbb$ ./stop.sh
SBB is not running
ubuntu@jumpto:~/sbb$ ./start.sh
4. 재시작하면 다음과 같이 logs 디렉터리가 생성되고 그 아래에 sbb.log라는 파일이 생성된 것을 확인할 수 있다.
사용자 로그 작성하기
위에서는 스프링 부트 프레임워크 자체가 출력하는 로그를 관리하는 방법을 말했다.
개발자가 코드를 작성하면서도 로그를 출력할 수 있다.
질문 목록 조회 시 GET방식으로 요청되는 매개변수의 입력값을 로그로 출력해보자.
question/QuestionController.java
@Slf4j
@RequestMapping("/question")
@RequiredArgsConstructor
@Controller
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 keyword) {
log.info("page:{}, kw:{}", page, keyword);
Page<Question> paging = this.questionService.getList(page, keyword);
model.addAttribute("paging",paging);
model.addAttribute("keyword", keyword);
return "question_list";
}
먼저 컨트롤러에 롬복이 제공하는 @Slf4j 어노테이션을 추가하고 메서드 안에는 'log.info("page:{}, kw:{}", page, keyword);'를 추가했다.
* 로그 단계
- trace(1단계): 가장 낮은 로그 레벨, debug보다 정보를 훨씬 상세하게 기록.
- debug(2단계): 디버깅 목적
- info(3단계): 주요 이벤트나 상태 등의 일반 정보를 출력할 목적
- warn(4단계): 문제가 발생할 가능성이 있는 상태나 상황 등 경고 정보 출력
- error(5단계): 심각한 문제나 예외 상황에 대한 오류 정보 출력 목적
- fatal(6단계): 가장 높은 로그 레벨, 프로그램 기능 일부가 실패하거나 오류 발생 등 심각한 문제 정보 출력
'IT > Spring Boot' 카테고리의 다른 글
[Spring Boot] 46. IP주소 도메인으로 변경하여 사용하기 (가비아) (0) | 2024.05.29 |
---|---|
[Spring Boot] 44. 80번 포트로 운영하기(포트 번호 없이 접속하기) (0) | 2024.05.28 |
[Spring Boot] 43. 서버 환경으로 분리(개발 환경 / 서버 환경) (0) | 2024.05.28 |
[Spring Boot] 42. 서버 스크립트 생성(서버 시작 및 중지 분리) (0) | 2024.05.28 |
[Spring Boot] 41. 서버 배포 - 배포하기(서버 설정 / 배포 파일 생성 및 전송) (0) | 2024.05.28 |