logback-spring/xml 설정

Better late than never·2023년 5월 9일
0

▶ 기본 특징

  • 대소문자 구별하지 않는다. ==
  • name attribute를 반드시 지정해야 한다.
  • Logback-spring.xml은 appender와 logger 크게 두개로 구분된다.
  • Dynamic Reloading 기능을 지원한다.ex) 60초 주기마다 로그파일(logback-spring.xml)이 바뀌었는지 검사하고 바뀌었으면 프로그램 갱신한다.
<?xml version="1.0" encoding="UTF-8"?>
  <!-- 60초마다 설정 파일의 변경을 확인 하여 변경시 갱신 -->
  <configuration scan="true" scanPeriod="60 seconds">
    로그백 설정 부분
</configuration>

▶ 1) appender

log의 형태를 설정, 로그 메시지가 출력될 대상을 결정하는 요소

(콘솔에 출력할지, 파일로 출력 할지 등의 설정)

  • appender의 class의 종류

1) ch.qos.logback.core.ConsoleAppender : 콘솔에 로그를 찍음, 로그를 OutputStream에 작성하여 콘솔에 출력되도록 한다.

2) ch.qos.logback.core.FileAppender : 파일에 로그를 찍음, 최대 보관 일 수 등를 지정할 수 있다.

3) ch.qos.logback.core.rolling.RollingFileAppender : 여러개의 파일을 롤링, 순회하면서 로그를 찍는다.(FileAppender를 상속 받는다. 지정 용량이 넘어간 Log File을 넘버링 하여 나누어 저장할 수 있다.)

4) ch.qos.logback.classic.net.SMTPAppender : 로그를 메일에 찍어 보낸다.

5) ch.qos.logback.classic.db.DBAppender : DB(데이터베이스)에 로그를 찍는다.

▶ 2) root, logger

설정한 appender를 참조하여 package와 level을 설정한다.

2.1) root

- 전역 설정이라고 볼 수 있다. - 지역적으로 선언된 logger 설정이 있다면 해당 logger 설정이 default로 적용된다.

2.2) logger

- 지역 설정이라고 볼 수 있다. - additivity 값은 root 설정 상속 유무 설정.(default = true)

▶ 3) property

- 설정파일에서 사용될 변수값 선언

▶ 4) layout, encoder

Layout : 로그의 출력 포맷을 지정한다. log4j 에서 설정할때 많이 사용했을 것이다. 

encoder : Appender에 포함되어 사용자가 지정한 형식으로 표현 될 로그메시지를 변환하는 역할을 담당하는 요소  

  • encoder는 바이트를 소유하고 있는 appender가 관리하는 OutputStream에 쓸 시간과 내용을 제어할 수 있다.   FileAppender와 하위 클래스는 encoder를 필요로 하고 더 이상 layout은 사용하지 않는다.즉 이제 layout보다는 encoder를 사용하면 된다.

▶ 5) pattern

[ 패턴에 사용되는 요소 ]

  • %Logger{length} : Logger name을 축약할 수 있다. {length}는 최대 자리 수, ex)logger{35}
  • %-5level : 로그 레벨, -5는 출력의 고정폭 값(5글자)
  • %msg : - 로그 메시지 (=%message)
  • ${PID:-} : 프로세스 아이디
  • %d : 로그 기록시간
  • %p : 로깅 레벨
  • %F : 로깅이 발생한 프로그램 파일명
  • %M : 로깅일 발생한 메소드의 명
  • %l : 로깅이 발생한 호출지의 정보
  • %L : 로깅이 발생한 호출지의 라인 수
  • %thread : 현재 Thread 명
  • %t : 로깅이 발생한 Thread 명
  • %c : 로깅이 발생한 카테고리
  • %C : 로깅이 발생한 클래스 명
  • %m : 로그 메시지
  • %n : 줄바꿈(new line)
  • %% : %를 출력
  • %r : 애플리케이션 시작 이후부터 로깅이 발생한 시점까지의 시간(ms)

▶ etc

기록할 파일명과 경로를 설정한다.

ch.qos.logback.core.rolling.TimeBasedRollingPolicy => 일자별 적용ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP => 일자별 + 크기별 적용

파일 쓰기가 종료된 log 파일명의 패턴을 지정한다..gz나 .zip으로 자동으로 압축할 수도 있다.

한 파일당 최대 파일 용량을 지정한다.log 내용의 크기도 IO성능에 영향을 미치기 때문에 되도록이면 너무 크지 않은 사이즈로 지정하는 것이 좋다.(최대 10MB 내외 권장)용량의 단위는 KB, MB, GB 3가지를 지정할 수 있다.RollingFile 이름 패턴에 .gz 이나 .zip을 입력할 경우 로그파일을 자동으로 압축해주는 기능도 있다.

최대 파일 생성 갯수예를들어 maxHistory가 30이고 Rolling정책을 일 단위로 하면 30일동안만 저장되고, 월 단위로 하면 30개월간 저장된다.

해당 패키지에 무조건 로그를 찍는 것말고도 필터링이 필요한 경우에 사용하는 기능이다.

하단의 예시 설정 파일에서 사용방법을 확인 하도록 하자. (레벨 필터를 추가해서 level이 error인 것만 찍게 만들었다.)

ex1) 스프링 프로필 설정 - application.properties

  • 추후 dev, stg, prod 등의 환경을 별도로 선언하기 가능하다.
# 프로필 설정spring.profiles.active=local

ex2) logback-local.properties 파일 생성

  • 간단하게 로그 경로와 파일 이름만 설정 해보도록 하겠다.
#로그파일 경로log.config.path=/logs/local
#로그파일 이름log.config.filename=local_log

ex3) logback-spring.xml 생성

  • 위에서 설명한 부분도 각각 주석을 추가하였으니 참고 하도록 하자.
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 60초마다 설정 파일의 변경을 확인 하여 변경시 갱신 -->
<configuration scan="true" scanPeriod="60 seconds">
    <!--springProfile 태그를 사용하면 logback 설정파일에서 복수개의 프로파일을 설정할 수 있다.-->
    <springProfile name="local">
        <property resource="logback-local.properties" />
    </springProfile>
    <springProfile name="dev">
        <property resource="logback-dev.properties" />
    </springProfile>
    <!--Environment 내의 프로퍼티들을 개별적으로 설정할 수도 있다.-->
    <springProperty scope="context" name="LOG_LEVEL" source="logging.level.root" />
    <!-- log file path -->
    <property name="LOG_PATH" value="${log.config.path}" />
    <!-- log file name -->
    <property name="LOG_FILE_NAME" value="${log.config.filename}" />
    <!-- err log file name -->
    <property name="ERR_LOG_FILE_NAME" value="err_log" />
    <!-- pattern -->
    <property name="LOG_PATTERN" value="%-5level %d{yy-MM-dd HH:mm:ss}[%thread] [%logger{0}:%line] - %msg%n" />
    <!-- Console Appender -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>
    <!-- File Appender -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 파일경로 설정 -->
        <file>${LOG_PATH}/${LOG_FILE_NAME}.log</file>
        <!-- 출력패턴 설정-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
        <!-- Rolling 정책 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 -->
            <fileNamePattern>${LOG_PATH}/${LOG_FILE_NAME}.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- 파일당 최고 용량 kb, mb, gb -->
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거-->
            <maxHistory>30</maxHistory>
            <!--<MinIndex>1</MinIndex>
            <MaxIndex>10</MaxIndex>-->
        </rollingPolicy>
    </appender>
    <!-- 에러의 경우 파일에 로그 처리 -->
    <appender name="Error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>error</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <file>${LOG_PATH}/${ERR_LOG_FILE_NAME}.log</file>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
        <!-- Rolling 정책 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 -->
            <fileNamePattern>${LOG_PATH}/${ERR_LOG_FILE_NAME}.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- 파일당 최고 용량 kb, mb, gb -->
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거-->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
    </appender>
    <!-- root레벨 설정 -->
    <root level="${LOG_LEVEL}">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
        <appender-ref ref="Error" />
    </root>
    <!-- 특정패키지 로깅레벨 설정 -->
    <logger name="org.apache.ibatis" level="DEBUG" additivity="false">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
        <appender-ref ref="Error" />
    </logger>
</configuration>

※ 위의 설정 내용을 캡쳐 화면과 함께 세분화 하여 살펴 보자.

1) Console Appender 설정

    <!-- Console Appender -->
		<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>

위의 설정을 통해 Console창에 로깅 메세지가 노출되는 것을 볼 수 있다.

ex) %-5level %d{yy-MM-dd HH:mm:ss}[**%thread] [%logger{0}:%line] - %msg**%n

=> INFO  20-02-16 16:34:42[**http-nio-8080-exec-3] [TestController:41] - INFO Level 테스트**

2) File Appender 설정

  • logback-local.properties에 설정한 경로와 파일명으로 로그 파일 생성 확인.
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 60초마다 설정 파일의 변경을 확인 하여 변경시 갱신 -->
<configuration scan="true" scanPeriod="60 seconds">
    <!--springProfile 태그를 사용하면 logback 설정파일에서 복수개의 프로파일을 설정할 수 있다.-->
    <springProfile name="local">
        <property resource="logback-local.properties" />
    </springProfile>
    <!--Environment 내의 프로퍼티들을 개별적으로 설정할 수도 있다.-->
    <springProperty scope="context" name="LOG_LEVEL" source="logging.level.root" />
    <!-- log file path -->
    <property name="LOG_PATH" value="${log.config.path}" />
    <!-- log file name -->
    <property name="LOG_FILE_NAME" value="${log.config.filename}" />
    <!-- pattern -->
    <property name="LOG_PATTERN" value="%-5level %d{yy-MM-dd HH:mm:ss}[%thread] [%logger{0}:%line] - %msg%n" />
    <!-- File Appender -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 파일경로 설정 -->
        <file>${LOG_PATH}/${LOG_FILE_NAME}.log</file>
        <!-- 출력패턴 설정-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
        <!-- Rolling 정책 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 -->
            <fileNamePattern>${LOG_PATH}/${LOG_FILE_NAME}.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- 파일당 최고 용량 kb, mb, gb -->
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거-->
            <maxHistory>30</maxHistory>
            <!--<MinIndex>1</MinIndex>
            <MaxIndex>10</MaxIndex>-->
        </rollingPolicy>
    </appender>
    <!-- root레벨 설정 -->
    <root level="${LOG_LEVEL}">
        <!-- <appender-ref ref="CONSOLE"/> -->
        <appender-ref ref="FILE" />
        <!-- <appender-ref ref="Error"/> -->
    </root>
</configuration>

  • local_log.2020-02-14.log 파일은 포스팅 2일 전에 찍어 두었던 로그이다. 일자별로 로그 설정이 되고 있음을 확인할 수 있다.

  • 위의 설정부분 중 최대 용량을 10KB로 변경하고 롤링 설정이 올바르게 되었는데 테스트 해보자. (fileNamePattern의 %i가 롤링 순번이며, 최저 최고 순번을 지정할 수 있다.)

다음 패턴 설정과 동일하게 로그를 끊는 것을 확인할 수 있다.

경로/파일명.yyyy-MM-dd_%롤링순번.log

3) filter 설정 확인 (error레벨의 로그만 별도 설정)

<?xml version="1.0" encoding="UTF-8"?><!-- 60초마다 설정 파일의 변경을 확인 하여 변경시 갱신 --><configuration scan="true" scanPeriod="60 seconds"><!--springProfile 태그를 사용하면 logback 설정파일에서 복수개의 프로파일을 설정할 수 있다.--><springProfile name="local"><property resource="logback-local.properties"/></springProfile><!--Environment 내의 프로퍼티들을 개별적으로 설정할 수도 있다.--><springProperty scope="context" name="LOG_LEVEL" source="logging.level.root"/>

<!-- 필터 사용 예제 --><appender name="Error" class="ch.qos.logback.core.rolling.RollingFileAppender"><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>error</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><file>${LOG_PATH}/${ERR_LOG_FILE_NAME}.log</file><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${LOG_PATTERN}</pattern></encoder><!-- Rolling 정책 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 --><fileNamePattern>${LOG_PATH}/${ERR_LOG_FILE_NAME}.%d{yyyy-MM-dd}_%i.log</fileNamePattern><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><!-- 파일당 최고 용량 kb, mb, gb --><maxFileSize>10MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy><!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거--><maxHistory>60</maxHistory></rollingPolicy>

<!-- root레벨 설정 --><root level="${LOG_LEVEL}"><!-- <appender-ref ref="CONSOLE"/> --><!-- <appender-ref ref="FILE"/> --><appender-ref ref="Error"/></root></appender><</configuration>

파일 생성

파일 내용

  • 에러 레벨의 로그내용만 따로 로그 파일로 저장할 수 있는 것을 볼 수 있다.

4) root, logger를 통해 전체 로깅 레벨과 특정 패키지의 로깅 레벨을 별도로 설정 가능 하다.

0개의 댓글