헤르메스 LIFE

[SpringBoot] Logback 설정 본문

Spring Boot Framework

[SpringBoot] Logback 설정

헤르메스의날개 2021. 7. 30. 00:48
728x90

Inteceptor 에서 Log를 찍고 싶은데, 찍을 수가 없습니다.

logback.xml 은 정상적으로 Log가 찍힙니다. 하지만 logback의 확장기능을 사용하고 싶어서 포기가 안되네요.

package com.study.wings.interceptor;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@Component
public class AuthInterceptor implements HandlerInterceptor {

    private static Logger logger = LoggerFactory.getLogger( AuthInterceptor.class);

    public boolean isInstance( Object handler, Class<?> clazz ) {
        if( !( handler instanceof HandlerMethod ) ) {
            return false;
        }

        Object object = ( (HandlerMethod)handler ).getBean();
        if( clazz.isInstance( object ) ) {
            return true;
        }

        return false;
    }

    @Override
    public boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object handler ) throws Exception {

        // 1. handler 종류 확인
        // Controller에 있는 메서드이므로 HandlerMethod 타입인지 체크
        if( !( handler instanceof HandlerMethod ) ) {
            // return true이면  Controller에 있는 메서드가 아니므로, 그대로 컨트롤러로 진행
            return true;
        }

        String targetURI = request.getServletPath();

        StringBuilder sb = new StringBuilder();
        // request 정보
        sb.append( "\n[preHandle] <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" );
        sb.append( "\n#remoteIp   : " ).append( request.getRemoteAddr() );
        sb.append( "\n#targetURI  : " ).append( targetURI );
        sb.append( "\n#reqUrl     : " ).append( request.getRequestURL().toString() );
        sb.append( "\n#userAgent  : " ).append( request.getHeader( "User-Agent" ) );
        sb.append( "\n<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" );
        logger.debug( sb.toString() );

        // session 객체를 가져옴
        HttpSession session = request.getSession();
        // login처리를 담당하는 사용자 정보를 담고 있는 객체를 가져옴
        Object obj = session.getAttribute("login");
        if ( obj == null ){
            // 로그인이 안되어 있는 상태임으로 로그인 폼으로 다시 돌려보냄(redirect)
            response.sendRedirect("/login.do");
            return false; // 더이상 컨트롤러 요청으로 가지 않도록 false로 반환함
        }

        return true;
    }
}

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!--Environment 내의 프로퍼티들을 개별적으로 설정할 수도 있다.-->
    <springProperty scope="context" name="LOG_LEVEL" source="logging.level.root"/>

    <!-- 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>

    <logger name="com.study.wings.interceptor" level="debug" >
        <appender-ref ref="CONSOLE"/>
    </logger>

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

</configuration>

logback.xml 설정 파일은 너무 빨리 로딩되기 때문에, extension을 사용하기 어렵습니다. 그러므로 logging.conifg를 정의해서 logback-spring.xml 을 사용해야 합니다.

logging.config=classpath:logback-spring.xml 로 지정을 해주어야 합니다.

# Logback 설정
logging.level.root=info
logging.config=classpath:logback-spring.xml 
spring.output.ansi.enabled=ALWAYS
728x90