ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring Boot] REST API 만들기(3) - Logback 설정
    Spring Boot/2.4.x - REST API 만들기 2020. 5. 4. 17:23
    반응형

    1. Logback 이란?

    Logback "자바 오픈소스 로깅 프레임워크"로 SLF4J의 구현체입니다. 스프링 부트의 기본으로 설정되어 있어서 dependency를 추가하지 않아도 사용 가능합니다.

     

    2. Logback 사용법

    org.slf4j.Logger와 org.slf4j.LoggerFactory를 import하고, LoggerFactory를 통해 logger를 주입 받으세요.

     

    BoardController.java

    더보기
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    package com.api.board.controller;
     
    import java.util.List;
     
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
     
    import com.api.board.domain.Board;
    import com.api.board.service.BoardService;
     
    @RequestMapping(value = "/board")
    @RestController
    public class BoardController {
     
        private final Logger logger = LoggerFactory.getLogger(this.getClass());
     
        @Autowired
        private BoardService boardService;
     
        @GetMapping
        public List<Board> getBoardList() throws Exception {
            
            logger.info("===== ===== ===== =====");
            logger.info("BoardController.getBoardList()");
            logger.info("===== ===== ===== =====");
            
            return boardService.getBoardList();
        }
    }
    cs

     

    3. 로그 레벨

    로그에 설정할 수 있는 레벨은 총 5가지로 설정한 레벨 이상의 로그를 출력합니다. 예를 들어 로그 레벨 설정을 "INFO"로 하였을 경우 "TRACE", "DEBUG" 레벨은 출력되지 않습니다. 

    TRACE  <  DEBUG  <  INFO  <  WARN  <  ERROR

    TRACE : TRACE 레벨은 DEBUG 레벨보다 상세한 정보를 나타냅니다.

    DEBUG : 프로그램을 디버깅하기 위한 정보를 표시합니다.

    INFO  : 상태 변경과 같은 정보성 로그를 표시합니다.

    WARN  : 처리 가능한 문제, 향후 시스템 에러의 원인이 될 수 있는 경고성 메시지를 나타냅니다.

    ERROR : 요청을 처리하는 중 오류가 발생한 경우 표시합니다.

     

    4. application.properties에서 로깅 레벨 설정 

    application.properties에서 root 로깅 레벨 설정하거나, 패키지 단위(logging.level.패키지)로 로깅 레벨 설정할 수 있습니다. 

    application.properties

    더보기
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    spring.datasource.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.datasource.hikari.jdbc-url=jdbc:mysql://localhost:3306/board?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC
    spring.datasource.hikari.username=board
    spring.datasource.hikari.password=password1!
     
    # root 로깅 레벨 설정
    logging.level.root=info
    # 패키지 단위로 로깅 레벨 설정 
    logging.level.com.api.board=info 
    logging.level.com.api.board.controller=debug
    cs

     

    BoardController.java

    더보기
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    package com.api.board.controller;
     
    import java.util.List;
     
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
     
    import com.api.board.domain.Board;
    import com.api.board.service.BoardService;
     
    @RequestMapping(value = "/board")
    @RestController
    public class BoardController {
     
        private final Logger logger = LoggerFactory.getLogger(this.getClass());
     
        @Autowired
        private BoardService boardService;
     
        @GetMapping
        public List<Board> getBoardList() throws Exception {
            
            logger.info("===== ===== ===== logging.level.com.api.board.controller - Logger Level ===== ===== =====");
            logger.trace("Logger Level - [TRACE]"); 
            logger.debug("Logger Level - [DEBUG]"); 
            logger.info("Logger Level - [INFO]"); 
            logger.warn("Logger Level - [WARN]"); 
            logger.error("Logger Level - [ERROR]");
            logger.info("===== ===== ===== logging.level.com.api.board.controller - Logger Level ===== ===== =====");
            
            return boardService.getBoardList();
        }
    }
    cs

     

    BoardService.java

    더보기
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    package com.api.board.service;
     
    import java.util.List;
     
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
     
    import com.api.board.domain.Board;
    import com.api.board.mapper.BoardMapper;
     
    @Service
    public class BoardService {
        
        private final Logger logger = LoggerFactory.getLogger(this.getClass());
     
        @Autowired
        private BoardMapper boardMapper;
     
        /** 게시글 목록 조회 */
        public List<Board> getBoardList() throws Exception {
     
            logger.info("===== ===== ===== logging.level.com.api.board - Logger Level ===== ===== =====");
            logger.trace("Logger Level - [TRACE]");
            logger.debug("Logger Level - [DEBUG]");
            logger.info("Logger Level - [INFO]");
            logger.warn("Logger Level - [WARN]");
            logger.error("Logger Level - [ERROR]");
            logger.info("===== ===== ===== logging.level.com.api.board - Logger Level ===== ===== =====");
     
            return boardMapper.getBoardList();
        }
    }
    cs

     

    5. logback-spring.xml 설정 

    logback-spring.xml은 appender와 logger로 나누어지는데 appender는 콘솔, 파일, DB 등 로그를 출력하는 방법을 지정할 수 있으며, logger는 출력할 위치를 설정할 수 있습니다. 

    classpath(resource 에 logback-spring.xml 파일이 있으면 설정된 정보를 참조하고 logback-spring.xml 파일이 없다면 .properties 파일의 설정된 정보를 참조합니다.

     

    5_1. application.properties 설정

    logback profile 설정을 설정하세요.

    application.properties

    더보기
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    spring.datasource.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.datasource.hikari.jdbc-url=jdbc:mysql://localhost:3306/board?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC
    spring.datasource.hikari.username=board
    spring.datasource.hikari.password=password1!
     
    # root 로깅 레벨 설정
    logging.level.root=info
    # 패키지 단위로 로깅 레벨 설정 
    logging.level.com.api.board=info 
    logging.level.com.api.board.controller=debug
     
    # profiles 설정
    spring.profiles.active=local
    cs

     

    5_2. logback-local.properties 추가

    src/main/resources 폴더에 logback-local.properties를 추가한 후 로그 경로와 로그 파일명을 설정하세요.

    logback-local.properties

    더보기
    1
    2
    log.config.path=c:/logs/local
    log.config.filename=local_log
    cs

     

    5_3. logback-spring.xml 추가

    src/main/resources 폴더에 logback-spring.xml를 추가한 후 logback에 대한 내용을 설정하세요.

    logback-spring.xml

    더보기
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    <?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="%d{yyyy-MM-dd HH:mm:ss} [%thread] [%-5level] %logger{36} - %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>
    cs

     

    5_4. Console에서 로그 확인

     

    5_5. 로그 파일 생성 확인

     

    소스 코드는 Github Repository - https://github.com/tychejin1218/api-board_v1 (branch : section03) 를 참조하세요.
    Github에서 프로젝트 가져오기 - https://tychejin.tistory.com/33

     

    반응형

    댓글

Designed by Tistory.