[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…)


image


확인해본 결과❗️

자바 실행 (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 설정

: 로그를 어디에 출력할지 설정

  1. ConsoleAppender: 콘솔에 로그 기록 (default)
  2. FileAppender: 파일에 로그 기록
  3. RollingFileAppender: 여러 개의 파일을 순회하며 로그 기록
  4. SMTPAppender: 메일로 로그 기록
  5. 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개의 크기)

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 없이 잘되네요 🚀 (만세)


이것으로 로깅 프레임워크 소개를 끝 마칩니다. 👨‍💻😃

오늘 내용은 여기서 끝~ :)




카테고리:

업데이트: