[Web] 로그를 어떻게 남기지? Logback
업데이트:
오늘은 스프링 부트에서 기본으로 사용하는 로깅 프레임워크, Logback📝 에 대해 소개하고자 합니다.
그 전에 Github Actions 로 이야기를 시작해보고자 하는데요.
운영 서버에 배포 후 로그를 남기는데 이슈가 있어서 Logback 설정을 살펴보게 되었습니다.
Github Actions
제가 요즘 아주 유용하게 사용하고 있는 CI/CD 툴인 Github Actions 입니다. 😃
Github Actions 스크립트를 잘 활용한다면
코드 build
부터 deploy
까지 하는 스크립트 하나로 해결할 수 있습니다.
그런데 deploy
쪽 명령어 중에서 행이 걸리는 이슈 가 발생했었습니다.
deploy.yml 中에서
sudo java -jar $SOURCE_DIR/$FILE_NAME >> /log/deploy/`date +%g-%m-%d`-deploy.log &
원래라고 한다면,
백그라운드 실행(&
) 을 했기 때문에 바로 PID를 리턴하고 끝나야하는게 정상인데,
Github Actions에서는 10분 이상 동안 종료처리를 못하는 이슈가 발생했었습니다. (❌ time out…)
확인해본 결과❗️
자바 실행 (java -jar
) 뒤에 추가했던
로그를 남기는 부분 (>> /log/deploy/date +%g-%m-%d-deploy.log
) 때문이었습니다.
이는 애써 미뤄왔던 `logback.xml` 의 내용을 살펴 볼 시간이 되었음을 의미했습니다.
로깅 프레임워크 (Logback)
Logback에 대해 잘 정리한 블로그 가 있어서 쉽게 내용을 확인할 수 있었습니다.
시간이 되신다면 위의 블로그 링크에서 내용을 따라가보심을 추천드립니다.
저는 핵심이 되는 내용을 살짝 소개하고,
바로 어플리케이션에 적용할 수 있게 하는데에 목적을 두고 글을 작성하겠습니다.
Logback
1. 아키텍처
-
Logger
: 로그 엔티티 (level속성 등 각종 구성 요소를 포함한 메세지 컨텍스트)
-
Appender
: 로그 메세지 출력 위치 (콘솔, 파일, 소켓, DB 등)
-
Layout
: 로그 메세지 출력 포맷
의 세 가지 클래스로 구성됩니다.
==> Logger
는 여러 Appender
를 가지며, Layout
으로 지정한 포맷으로 출력합니다.
2. 모듈 구성
-
logback-core
: 로깅 프레임워크의 핵심 기능을 제공 (Appender, Layout 포함)
-
logback-classic
: core 모듈에서 확장된 모듈. 더 많은 기능을 추가. (Logger 포함)
-
logback-access
: HTTP 엑세스 로그를 작성하는데 사용할 수 있도록 서블릿 컨테이너와 통합
3. 레벨
TRACE > DEBUG > INFO > WARN > ERROR
(레벨을 INFO로 설정하면 INFO, WARN, ERROR 로그를 출력)
4. 패턴
로그 패턴을 property로 설정할 때,
"%-5level %white(%d{yy-MM-dd HH:mm:ss}) [%thread] [%logger{0}:%line] - %msg%n"
%-5level
: 로그 레벨을 5글자 너비로 왼쪽 정렬되도록 설정%white()
:()
안의 문자를 흰색으로 표시%thread
: 로깅 이벤트를 생성한 쓰레드 ex) [main]%logger{0}
: logger는 변환 단어이고,{}
안의 값은 string의 길이%line
: 로깅요청이 발생된 라인 번호 (실행 속도에 문제를 줄 수 있음)%msg
: 애플리케이션 제공 메시지%n
: 줄 구분자
cf) logback 공식 문서 - 패턴 를 참고하였습니다.
우테코 프로젝트를 둘러보다가 마음에 드는 예제를 소개합니다. (원문 보기)
<property name="LOG_PATTERN"
value="%white(%d{HH:mm:ss.SSS}) %cyan([%thread]) %highlight([%-5level]) %yellow([%logger{0}]) - %boldWhite(%m%n)"/>
<property name="LOG_FILE_PATTERN"
value="%d{HH:mm:ss.SSS} [%thread] [%-5level] [%logger{0}] - %m%n"/>
5. Appender 설정
: 로그를 어디에 출력할지 설정
- ConsoleAppender: 콘솔에 로그 기록 (default)
- FileAppender: 파일에 로그 기록
- RollingFileAppender: 여러 개의 파일을 순회하며 로그 기록
- SMTPAppender: 메일로 로그 기록
- DBAppender: DB에 로그 기록
tips) 태그(< >
) 정보 메모
-
appender
-
encoder (패턴 지정)
-
file (파일 경로, 이름)
-
filter
-
class
-
LevelFilter (로그 레벨별 필터링)
-
ThresholdFilter (로그 레벨보다 같거나 이상인것 필터링)
-
-
level (로그 레벨)
-
onMatch (설정한 레벨과 일치했을 때)
-
onMismatch (설정한 레벨과 불일치 했을 때)
-
-
rollingPolicy (시간 or 크기를 기준으로 새로운 로그 파일로 변경)
-
TimeBasedRollingPolicy (시간 기반)
-
fileNamePattern
(아카이브될 파일 패턴으로, dateTime 패턴의 최소 단위에 따라 주기가 결정됨)
-
maxHistory (보관 주기)
-
totalSizeCap (전체 아카이브된 로그 파일 크기)
-
timeBasedFileNamingAndTriggeringPolicy (트리거 가능)
- maxFileSize (로그 파일 1개의 크기)
-
-
SizeAndTimeBasedRollingPolicy (크키 및 시간 기반)
- fileNamePattern (아카이브될 파일 패턴으로,
%i
와%d
입력이 필수.)%i
: 인덱스%d{date패턴}
: 날짜 및 시간 패턴
- maxFileSize (로그 파일 1개의 크기)
- fileNamePattern (아카이브될 파일 패턴으로,
-
-
cf) logback 공식 문서 - RollingPolicy 를 참고하였습니다.
결과
우선 문제가 되었던 부분을 다음과 같이 바꾸었습니다.
deploy.yml
sudo java -jar $SOURCE_DIR/$FILE_NAME > /dev/null 2>&1 &
cf) /dev/null 2>1 &
: 표준에러를 표준출력으로 리다이렉트 하여 버리고 백그라운드에서 구동하라는 뜻 (참고)
그리고 logback.xml 을 참고하실 분들은
==> 여기로 이동하시면 됩니다.
로그도 잘 남고, Actions도 time out 없이 잘되네요 🚀 (만세)
이것으로 로깅 프레임워크 소개를 끝 마칩니다. 👨💻😃
오늘 내용은 여기서 끝~ :)