Spring Boot/Logback

Logback 커스텀하게 사용하기

수수한개발자 2023. 1. 15.
728x90

이전글들에서 로그백설정으로 로그를 나오게 해봤습니다.

 

하지만 개발을 하다보면 커스텀하게 1에서는 ~~ 이렇게 로그를 찍고 싶고 2에서는 !!! 이렇게 로그를 찍고 싶은 상황이 있을 것입니다. 그 상황에 맞춰서 로그백을 설정하는 법을 알아보겠습니다.

 

 

logback-spring-prod.xml

<included>
   <property resource="logback-variables.properties" />
    <appender name="REQUEST1" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_DIR}/request1.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/archive/request1.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <maxFileSize>1KB</maxFileSize>  <!-- 로그파일 최대 크기 -->
            <maxHistory>30</maxHistory> <!-- 로그파일 최대 보관주기 (단위 : 일) -->
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>
                [REQUEST1] ${LOG_PATTERN}
            </pattern>
            <outputPatternAsHeader>true</outputPatternAsHeader>
        </encoder>
    </appender>

    <appender name="REQUEST2" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_DIR}/request2.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/archive/request2.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <maxFileSize>10KB</maxFileSize>  <!-- 로그파일 최대 크기 -->
            <maxHistory>30</maxHistory> <!-- 로그파일 최대 보관주기 (단위 : 일) -->
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>
                [REQUEST1] ${LOG_PATTERN}
            </pattern>
            <outputPatternAsHeader>true</outputPatternAsHeader>
        </encoder>
    </appender>

    <appender name="MDC" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_DIR}/mdc.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/archive/mdc.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <maxFileSize>10KB</maxFileSize>  <!-- 로그파일 최대 크기 -->
            <maxHistory>30</maxHistory> <!-- 로그파일 최대 보관주기 (단위 : 일) -->
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>
                [MDC] %X{job}%n
            </pattern>
            <outputPatternAsHeader>true</outputPatternAsHeader>
        </encoder>
    </appender>

    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_DIR}/error.log</file>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>error</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/archive/error.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <maxFileSize>10KB</maxFileSize>  <!-- 로그파일 최대 크기 -->
            <maxHistory>30</maxHistory> <!-- 로그파일 최대 보관주기 (단위 : 일) -->
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>
                [ERROR] ${LOG_PATTERN}
            </pattern>
            <outputPatternAsHeader>true</outputPatternAsHeader>
        </encoder>
    </appender>

    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_DIR}/warn.log</file>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/archive/warn.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <maxFileSize>10KB</maxFileSize>  <!-- 로그파일 최대 크기 -->
            <maxHistory>30</maxHistory> <!-- 로그파일 최대 보관주기 (단위 : 일) -->
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>
                [WARN] ${LOG_PATTERN}
            </pattern>
            <outputPatternAsHeader>true</outputPatternAsHeader>
        </encoder>
    </appender>

    <appender name="QUERY" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_DIR}/query.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/archive/query.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <maxFileSize>10KB</maxFileSize>  <!-- 로그파일 최대 크기 -->
            <maxHistory>30</maxHistory> <!-- 로그파일 최대 보관주기 (단위 : 일) -->
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>
                [QUERY] ${LOG_PATTERN}
            </pattern>
            <outputPatternAsHeader>true</outputPatternAsHeader>
        </encoder>
    </appender>

    <root level="INFO">
<!--        <appender-ref ref="REQUEST1" />-->
<!--        <appender-ref ref="REQUEST2" />-->
<!--        <appender-ref ref="MDC" />-->
<!--        <appender-ref ref="ERROR" />-->
<!--        <appender-ref ref="WARN" />-->
    </root>

	<logger name="SQL_LOG1" level="INFO" additivitty="false">
        <appender-ref ref="QUERY" />
    </logger>
    
    <logger name="com.example.logback.controller" level="INFO" additivitty="false">
        <appender-ref ref="QUERY" />
    </logger>

    <logger name="SQL_LOG2" level="INFO"  additivitty="false">
        <appender-ref ref="QUERY" />
    </logger>

</included>

 

기본적인 설정은 이전글들과 같습니다.

appender 를 하나 만들어준뒤 이름을 만들어 주고 컨트롤러에 찍으면 됩니다.

 

QueryController1

 

@Slf4j(topic = "SQL_LOG1")
@RestController
public class QueryController1 {

    @GetMapping("/query1")
    public String query1() {
        log.trace("log --> TRACE");
        log.debug("log --> DEBUG");
        log.info("log --> INFO");
        log.warn("log --> WARN");
        log.error("log --> ERROR");
        return "query1";
    }
}

위의 코드를 보시면 logger 를 설정한  name과 @Slf4j의 topic 과 같은 이름으로 해주면 됩니다.

또 다른 방법을 알아보겠습니다.

 

QueryController2

@RestController
public class QueryController2 {

    public static final Logger log = LoggerFactory.getLogger("SQL_LOG2");

    @GetMapping("/query2")
    public String query1() {
        log.trace("log --> TRACE");
        log.debug("log --> DEBUG");
        log.info("log --> INFO");
        log.warn("log --> WARN");
        log.error("log --> ERROR");
        return "query1";
    }
}

이런식으로 Logger를 선언해서 사용할 수 도 있습니다.

 

 

하지만 매번 이렇게 @Slf4j에 topic을 달아주거나 Logger를 선언해서 하면 귀찮습니다....

그럴때 logger 의 name을 로그를 찍고 싶은 곳의 패키지를 적어주면 @Slf4j 어노테이션만으로도 로그가 찍힙니다.

 

728x90

'Spring Boot > Logback' 카테고리의 다른 글

Logback - fileAppender  (0) 2023.01.15
Logback 설정하기  (0) 2023.01.15

댓글