Skip to content

logback VS log4j2

백승주 edited this page Mar 29, 2023 · 1 revision

logback

  • spring-boot-starter-web의 기본 로깅 프레임워크

log4j2

  • logback, log4j의 단점을 개선한 로깅 프레임워크
  • logback보다 탁월한 성능 및 다양한 appender 제공

logback으로도 충분히 파일 로깅을 할 수 있기에 logback을 사용하기로 한다.

환경 세팅

configurations {
    // logback 의존성 제거
    all {
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
    }
}

dependencies {
    // log4j2
    implementation 'org.springframework.boot:spring-boot-starter-log4j2'
    implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml'
}

spring-boot-starter-web에서 기본으로 제공하는 logback 로깅 프레임워크 의존성을 제거하지 않으면 에러가 발생한다.

application.yaml

# application.yml
logging:
  config: classpath:log4j2.yml

기본 default 값은 다음과 같다. 만약 로컬 환경과 배포환경이 나누어져있다면 logging의 config를 그에 맞게 수정해줘야 한다.

# application-local.yml
logging:
  config: classpath:log4j2-local.yml

# application-prod.yml
logging:
  config: classpath:log4j2-prod.yml

로깅 전략

로깅 전략에 따라서 log4j2 yml 파일의 내용이 달라진다.

Console 방식, file(단일 파일, 재실행 시 사라짐), rollingfile(아카이브화 하여 보관)

우리는 로컬에서는 file, rollingfile로 남길 필요가 없다고 판단하여 Appender를 Console로 설정했다.

배포 환경에서는 로그 파일을 보관하는 것이 좋다고 판단해 RollingFile_Appender로 설정했다.

로컬 환경에서는 DEBUG, 배포 환경에서는 INFO로 로그 레벨을 설정했다.

그러나, 로컬과 개발에서 Spring Application을 구동 시 스프링 관련 불필요한 정보들이 너무 많이 출력돼 Root log level은 INFO로, Controller 패키지 이하에서는 DEBUG로 설정하는 방식으로 변경했다.

log4j2-local.yaml

# log4j2-local.yaml
Configutation:
  name: Default
  status: info

  Properties:
    Property:
      name: log-path
      value: "logs"

  Appenders:
    Console:
      name: Console_Appender
      target: SYSTEM_OUT
      PatternLayout:
        pattern: "%style{%d{yyyy-MM-dd HH:mm:ss.SSS}}{cyan} %highlight{[%-5p]}{FATAL=bg_red,
            ERROR=red, INFO=green, DEBUG=blue, TRACE=bg_yellow} [%C] %style{[%t]}{yellow}- %m%n"
  Loggers:
    Root:
      level: info
      AppenderRef:
        - ref: Console_Appender
    Logger:
      - name: com.gabia.bshop
        additivity: false
        level: debug
        AppenderRef:
          - ref: Console_Appender

log4j2-prod.yaml

Configutation:
  name: Default
  status: info

  Properties:
    Property:
      name: log-path
      value: "logs"

  Appenders:
    RollingFile:
      - name: RollingFile_Appender
        fileName: ${log-path}/rollingfile.log
        filePattern: "${log-path}/archive/rollingfile.log_%d{yyyy-MM-dd}-%i.gz"
        PatternLayout:
          pattern: "%style{%d{yyyy-MM-dd HH:mm:ss.SSS}}{cyan} %highlight{[%-5p]}{FATAL=bg_red,
            ERROR=red, INFO=green, DEBUG=blue, TRACE=bg_yellow} [%C] %style{[%t]}{yellow}- %m%n"
        Policies:
          TimeBasedTriggeringPolicy:
            Interval: 1
            modulate: true
          SizeBasedTriggeringPolicy:
            size: "10 MB"
        DefaultRollOverStrategy:
          max: 10
          Delete:
            basePath: "${log-path}/archive"
            maxDepth: "1"
            IfLastModified:
              age: "P14D"
            IfAccumulatedFileCount:
              exceeds: 140
  Loggers:
    Root:
      level: info
      AppenderRef:
        - ref: RollingFile_Appender
    Logger:
      - name: com.gabia.bshop
        additivity: false
        level: info
        AppenderRef:
          - ref: RollingFile_Appender

Configuration

Configutation:
  name: Default
  status: info

로그 설정의 최상위 요소이다. 해당 파일의 루트 로깅 전략의 name과 status를 적어주면 된다.

status는 log level을 적어주면 된다. error, warn, info, debug, trace 중에서 선택하면 된다.

로그 레벨은 아래 순서를 따른다.

TRACE > DEBUG > INFO > WARN > ERROR

보통은 개발 환경에서는 debug 또는 info, 배포 환경에서는 info를 많이 하는 것으로 보인다.

무조건 많은 정보를 띄운다고 좋은 것이 아니다. 그만큼 용량을 많이 차지하고 불필요한 로그가 기록돼 가독성이 떨어지게 되기 때문이다.

Properties

Properties:
    Property:
      name: log-path
      value: "logs"

Appenders

Appenders:
Console:
  name: Console_Appender
  target: SYSTEM_OUT
  PatternLayout:
    pattern: "%style{%d{yyyy-MM-dd HH:mm:ss.SSS}}{cyan} %highlight{[%-5p]}{FATAL=bg_red,
        ERROR=red, INFO=green, DEBUG=blue, TRACE=bg_yellow} [%C] %style{[%t]}{yellow}- %m%n"

로깅 전략을 명시해주는 부분이다.

  • target: 표준 입출력임을 명시
  • pattern: 로그 스타일 지정하여 가독성을 높일 수 있음 ( ERROR는 빨간색, INFO는 초록색 등으로)

RollingFile_Appender로 할 경우 파일을 저장할 기간, 용량 관리 등을 설정해주어야 하므로 꽤 복잡해진다.

Appenders:
  RollingFile:
    - name: RollingFile_Appender
      fileName: ${log-path}/rollingfile.log
      filePattern: "${log-path}/archive/rollingfile.log_%d{yyyy-MM-dd}-%i.gz"
      PatternLayout:
        pattern: "%style{%d{yyyy-MM-dd HH:mm:ss.SSS}}{cyan} %highlight{[%-5p]}{FATAL=bg_red,
            ERROR=red, INFO=green, DEBUG=blue, TRACE=bg_yellow} [%C] %style{[%t]}{yellow}- %m%n"
      Policies:
        TimeBasedTriggeringPolicy:
          Interval: 1
          modulate: true
        SizeBasedTriggeringPolicy:
          size: "10 MB"
      DefaultRollOverStrategy:
        max: 10
        Delete:
          basePath: "${log-path}/archive"
          maxDepth: "1"
          IfLastModified:
            age: "P14D"
          IfAccumulatedFileCount:
            exceeds: 140
  • File

    • name : RollingFileAppender 이름
    • fileName : 저장할 파일 경로, 이름에 날짜 형식을 지정하여 저장 가능 (Properties에 지정한 logs 디렉토리의 archive 디렉토리 아래에 rollingfile.log_%d{yyyy-MM-dd}.gz 파일명으로 로그 저장)
    • PatternLayout : 로그 출력 양식 지정
  • Policy : File RollingUp의 기준을 지정

    • OnStartupTriggeringPolicy : jvm start시 trigger
    • TimeBasedTriggeringPolicy + Interval : time에 따른 trigger(파일 이름 패턴의 최소단위 날짜로 계산, 위 예시는 하루에 한 번 RollingUp). 위 예시는 하루 단위로 압축 보관하도록 함.
    • SizeBasedTriggeringPolicy + size : file size에 따른 trigger.
    • CronTriggeringPolicy : Cron Expression(시간에 관한 표현)에 따른 trigger
  • DefaultRollOverStrategy : Rolling File을 Over(삭제)하는 기준을 지정

    • max: 동시간대에 최대 10개까지 RollingFiles가 생성될 수 있도록 지정
    • basePath: 아카이브화할 로그 파일 위치 지정. (Properties에 지정한 logs 디렉토리의 archive 디렉토리 아래에 rollingfile.log_%d{yyyy-MM-dd}.gz 파일명으로 로그 저장)
    • IfLastModified - age: "P14D": 수정된지 14일이 지난 파일은 삭제
    • IfAccumulatedFileCount : RollingUp된 압축파일을 저장하는 디렉토리에 존재할 수 있는 파일 개수. 파일 개수를 넘으면 오래된 파일부터 삭제(총 140개 초과시 오래된 파일부터 삭제)

제사한 내용은 공식 문서를 참고하자.
https://logging.apache.org/log4j/2.x/manual/appenders.html#RollingFileAppender

Loggers

Loggers:
Root:
  level: info
  AppenderRef:
    - ref: Console_Appender
Logger:
  - name: com.gabia.bshop
    additivity: false
    level: debug
    AppenderRef:
      - ref: Console_Appender

로깅을 직접하는 요소, 로거는 패키지 별도로 설정이 가능하다. Root 패키지의 로거는 필수적으로 세팅해주어야 하며, 추가적인 로거를 설정하려면 Logger로 설정해주어야 한다.

  • level : 해당 패키지에 찍을 최하 로그 레벨을 지정
  • additivity : false로 지정시 로그가 중복으로 찍히는 것을 방지 (기본값: true)
  • AppenderRef : ref속성으로 적용할 Appender를 지정
Clone this wiki locally