스프링부트에 log4j2 설정

Dogin·2021년 3월 3일
1

logger

목록 보기
3/3
post-thumbnail

스프링부트에 log4j2.ymlbuild.gradle을 이용하여 log4j2를 설정

1. build.gradle

기본적으로 slf4j 로깅 프레임워크를 사용하고, spring-boot-starter-weblogback이 기본 로깅 모듈이므로 logback의 의존성을 제거하고 log4j2 의존성을 추가해야한다. (logback 미제거시 multiple binding error)

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

dependencies { /*log4j2 의존성 추가*/
	compile 'org.springframework.boot:spring-boot-starter-log4j2'
	compile group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.10.3'
}

2. application.yml

applcation.yml에 하나씩 설정하는 방법도 있지만 그렇게하면 내용이 너무 길어지고 커스텀하기 힘들다는 단점이 있어 log4j2.yml 파일을 생성하고 applcation.yml에는 해당 파일을 참조하도록 설계

application.yml과 log4j2.yml이 src내부 resources디렉터리 하위에 위치할 때
logging:
  config: classpath:log4j2.xml
application.yml과 log4j2.yml이 src외부 프로젝트 바로 아래 config 디렉터리에 위치할 때
logging:
  config: file:./config/log4j2.yml

3. log4j2.yml

아래는 log4j2.yml에 작성한 코드 내용이다.

Configutation:
  name: Default
  status: warn

  Properties:
    Property:
      name: log-path
      value: "logs"
       
  Appenders:
    Console:
      name: Console_Appender
      target: SYSTEM_OUT
      PatternLayout:
        pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t][%F] %c{1} - %msg%n"
    File:
      name: File_Appender
      fileName: ${log-path}/logfile.log
      PatternLayout:
        pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t][%F] %c{1} - %msg%n"
    RollingFile:
      - name: RollingFile_Appender
        fileName: ${log-path}/rollingfile.log
        filePattern: "${log-path}/archive/rollingfile.log_%d{yyyy-MM-dd}.gz"
        PatternLayout:
          pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t][%F] %c{1} - %msg%n"
        Policies:
          TimeBasedTriggeringPolicy:
            Interval: 1
            modulate: true
        DefaultRollOverStrategy:
          Delete: 
            basePath: "${log-path}/archive" 
            maxDepth: "1" 
            IfAccumulatedFileCount: 
              exceeds: 31
  Loggers:
    Root:
      level: info
      AppenderRef:
        - ref: Console_Appender
        - ref: File_Appender
        - ref: RollingFile_Appender
    Logger:
      - name: 적용할 패키지
        additivity: false
        level: info
        AppenderRef:
          - ref: Console_Appender
          - ref: File_Appender
          - ref: RollingFile_Appender

3-1. Configuration

Configutation:
  name: Default
  status: warn
  • 로그 설정의 최상위 요소로 Properties, Appenders, Loggers요소를 자식으로 가진다.
  • status 는 내부 이벤트에 대한 로그 레벨을 의미

3-2. Properties

  Properties:
    Property:
      name: log-path
      value: "logs"
  • Configuration에서 사용할 Properties를 설정하는 것으로 name 속성이 key, value 속성이 value 값으로 생각(간단하게 변수로 이해하기)

3-3. Appenders

  Appenders:
    Console:
      name: Console_Appender
      target: SYSTEM_OUT
      PatternLayout:
        pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t][%F] %c{1} - %msg%n"
    File:
      name: File_Appender
      fileName: ${log-path}/logfile.log
      PatternLayout:
        pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t][%F] %c{1} - %msg%n"
    RollingFile:
      - name: RollingFile_Appender
        fileName: ${log-path}/rollingfile.log
        filePattern: "${log-path}/archive/rollingfile.log_%d{yyyy-MM-dd}.gz"
        PatternLayout:
          pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t][%F] %c{1} - %msg%n"
        Policies:
          TimeBasedTriggeringPolicy:
            Interval: 1
            modulate: true
        DefaultRollOverStrategy:
          Delete: 
            basePath: "${log-path}/archive" 
            maxDepth: "1" 
            IfAccumulatedFileCount: 
              exceeds: 31
  • Appender는 로그 메시지를 특정 위치에 전달하는 역할을 한다.
  • ConsoleAppender,FileAppender,RollingFileAppender 등을 가진다.
  • 출력 결과를 나타내기 위해 Format문자를 사용.
    • %c, %logger : 해당되는 로거의 이름을 출력
    • %C, %class : 클래스명을 출력
    • %d, %date : 해당 로그가 발생한 시간
      • 포맷은 %d{HH:mm:ss}, %d{yyyy-MM-dd HH:mm:ss}같은 형태로 사용
    • %enc, %encode : 특정 언어에서의 출력을 위한 문자 인코딩
    • %ex, %exception, %throwable : 예외 로그. 길이를 설정할 수 있음.
    • %F, %file : 해당 로그가 발생한 클래스 파일명
    • %l, %location : 해당 로그가 발생한 클래스명.메소드명(파일:라인)
    • %L, %line : 해당 로그가 발생한 라인 번호
    • %m, %msg, %message : 로그문에 전달된 메시지
    • %n : 줄바꿈
    • %p, %level : 로그 레벨
      • FATAL : 아주 심각한 에러가 발생한 상태
      • ERROR : 요청을 처리하는 중 문제가 발생한 상태
      • WARN : 처리 가능한 문제이지만, 향후 에러의 원인이 될 수 있는 상태
      • INFO : 로그인, 상태변경과 같은 정보성 메세지
      • DEBUG : 개발시 디버그 용도로 사용
      • TRACE : 디버그 레벨이 너무 광범한 것을 해결하기 위해서 좀 더 상세한 상태를 나타냄
    • %r, %relative : 로그 처리시간
    • %t, %thread : 해당 로그가 발생한 스레드명
    • %style{pattern}{ANSI style} : ANSI를 사용해 특정 패턴을 스타일링함
    • %highlight{pattern}{style} : 로그 레벨명을 ANSI 색깔로 하이라이트

3-3-1. Appender - Console

    Console:
      name: Console_Appender
      target: SYSTEM_OUT
      PatternLayout:
        pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t][%F] %c{1} - %msg%n"
  • name : ConsoleAppender 이름
  • target : 출력 방식 기본값은 SYSTEM_OUT, SYSTEM_ERR로 출력가능
  • PatternLayout : pattern에 로그 출력 양식 지정

3-3-2. Appender - File

    File:
      name: File_Appender
      fileName: ${log-path}/logfile.log
      PatternLayout:
        pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t][%F] %c{1} - %msg%n"
  • name : FileAppender 이름
  • fileName : 저장할 파일 경로, 이름 지정(Properties에 지정한 logs 디렉터리에 logfile.log 파일명으로 로그 저장)
  • PatternLayout : pattern에 로그 출력 양식 지정

3-3-3. Appender - RollingFile

로그 내용을 한 파일에 계속 저장한다면 파일이 너무 커지고 문제가 생기면 로그를 모두 날려버릴 수 있으므로 RollingFileAppender는 특정 기준으로 압축하여 저장하는 방식의 Appender이다.
File, Policy, Straegy 관련된 속성이 있다.

    RollingFile:
      - name: RollingFile_Appender
        fileName: ${log-path}/rollingfile.log
        filePattern: "${log-path}/archive/rollingfile.log_%d{yyyy-MM-dd}.gz"
        PatternLayout:
          pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t][%F] %c{1} - %msg%n"
        Policies:
          TimeBasedTriggeringPolicy:
            Interval: 1
            modulate: true
        DefaultRollOverStrategy:
          Delete: 
            basePath: "${log-path}/archive" 
            maxDepth: "1" 
            IfAccumulatedFileCount: 
              exceeds: 31
  • File
    • name : RollingFileAppender 이름
    • fileName : 저장할 파일 경로, 이름에 날짜 형식을 지정하여 저장 가능 (Properties에 지정한 logs 디렉터리 아래 archive 디렉터리 아래 rollingfile.log_%d{yyyy-MM-dd}.gz 파일명으로 로그 저장)
    • PatternLayout : pattern에 로그 출력 양식 지정
  • Policy : File RollingUp의 기준을 지정
    • OnStartupTriggeringPolicy : jvm start시 trigger
    • TimeBasedTriggeringPolicy + Interval : time에 따른 trigger
      (파일 이름 패턴의 최소단위 날짜로 계산, 위 예시는 하루에 한 번 RollingUp)
    • SizeBasedTriggeringPolicy + size : file size에 따른 trigger
    • CronTriggeringPolicy : Cron Expression(시간에 관한 표현)에 따른 trigger
  • DefaultRollOverStrategy
    • atetime 패턴과 파일패턴의 int값을 받아서 결정된다. datetime은 현재 시간으로 대체되고, 파일 패턴 숫자는 db의 autoincrement처럼 rollover 마다 1씩 증가
    • %i가 파일패턴의 int rollingfile.log_%d{yyyy-MM-dd}%i.gz일 때
      ex) rollingfile.log_2021-03-03_1.gz, rollingfile.log_2021-03-03_2.gz...
    • IfAccumulatedFileCount : RollingUp된 압축파일을 저장하는 디렉터리에 존재할 수 있는 파일 개수. 파일 개수를 넘으면 오래된 파일부터 삭제(30개 초과시 오래된 파일부터 삭제, 30일치 로그 보관)

3-4. Loggers

로깅을 직접 하는 요소입니다. 로거는 패키지 별로 설정 가능
Root패키지의 로거는 필수적이고, 추가적인 로거는 Logger로 설정

  Loggers:
    Root:
      level: info
      AppenderRef:
        - ref: Console_Appender
        - ref: File_Appender
        - ref: RollingFile_Appender
    Logger:
      - name: 적용할 패키지
        additivity: false
        level: info
        AppenderRef:
          - ref: Console_Appender
          - ref: File_Appender
          - ref: RollingFile_Appender
  • level : 해당 패키지에 찍을 최하 로그 레벨 지정
  • AppenderRef : ref속성으로 적용할 Appender 지정
  • additivity : false로 지정시 로그가 중복으로 찍히는 것을 방지 (기본값 true)

참고사이트

profile
지금 바로 Do!!

0개의 댓글