코딩항해기

[Team/붕어빵원정대(최프)] 로그 관리 본문

Project

[Team/붕어빵원정대(최프)] 로그 관리

miniBcake 2024. 11. 1. 14:41

 

필요성

MVC 파트를 나눠 횡단으로 작업을 진행한 후 종단 작업을 통해 기능을 연결하고 오류를 해결하게 되는데, 각각의 로그 스타일이 다르고 JDBCTemplate를 사용하게 되며 로그를 남길 수 있는 부분도 많이 줄어들게 되었다. 이로 인해 종단 작업 시 코드를 하나하나 살펴봐야하는 문제, 또는 새롭게 로그를 남겨야하는 문제가 발생하게 되어 자동 로그에 대해 필요성이 생기게 되었다.

 

계획

  • Service 시작과 종료 로그
  • 요청(사용자 요청) 시작과 종료 로그
  • JDBC 실행 쿼리문, 들어가는 값에 대한 로그

3가지에 대한 자동로그를 만들기로 결정했다.

 

먼저 Service은 핵심기능이므로, 매번 반복되어 로그를 찍는 것은 횡단 기능이다. 즉, AOP를 사용할 수 있다.

사용자의 요청이 들어올 때 가장 먼저, 가장 마지막에 위치할 수 있는 것은 Filter이므로 Filter를 사용할 수 있다.

JDBC 실행 쿼리문, 들어가는 값에 대한 로그는 현재 사용 중인 로그 프레임워크를 사용할 수 있다.

 

실행

AOP

@Service
@Slf4j
@Aspect
public class LogAdvice {
    //Service 사용 시작 로그
    @Before("PointcutCommon.allPointcut()")
    public void beforeLogger(JoinPoint joinPoint) throws Throwable {
        log.info("\u001B[33m---- AOP: start Service : {}\u001B[0m", joinPoint.getSignature());
    }
    //Service 사용 종료 로그
    @After("PointcutCommon.allPointcut()")
    public void afterLogger(JoinPoint joinPoint) throws Throwable {
        log.info("\u001B[33m---- AOP: end Service : {}\u001B[0m", joinPoint.getSignature());
    }
}

 

AOP는 사실 이미 AOP 계획 단계에 들어가 있어 추가 작업이 필요없었으며 색상을 통해 구분이 쉽도록 작업해두었다.

 

 

[Team/붕어빵원정대(최프)] AOP 작업

AOP 개념을 처음 배우다보니 설계도 우여곡절이 많았는데 관련 서적과 검색, 실무에 대해 아시는 분의 조언을 통해 최종 횡단 기능을 정리하고 AOP 작업을 진행했다. 설계 검증 로직과 반복되는

minibcake.tistory.com

 

 

 

Filter

@WebFilter("*.do")
@Slf4j
public class LogFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        String uri = req.getRequestURI();
        String cp = req.getContextPath();
        // 프로젝트 패스만큼 자름
        String command = uri.substring(cp.length());
        log.info("\u001B[35mFilter command start : [{}]\u001B[0m", command); //요청 시작 로그
        chain.doFilter(request, response); //해당 코드를 기준으로 전처리, 후처리
        log.info("\u001B[35mFilter command end : [{}]\u001B[0m", command); //요청 끝 로그
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

 

필터의 경우 Controller가 처리하는 *.do 요청이 시작 될 때마다 시작로그를 찍게되며, 모든 요청이 끝나면 후처리를 거쳐 끝 로그를 찍고 나서 응답하게 된다.

 

[JSP] Servlet - 필터 Filter

[JSP] Servlet - 리스너 Listener리스너 Listener컨테이너에서 발생하는 이벤트를 모니터링하다가 특정 이벤트가 발생하면 실행되는 특수한 서블릿으로, '이벤트 리스너(Event Listener)'라고도 한다. 웹 애

minibcake.tistory.com

 

 

logback 설정

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%boldWhite(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%thread] %highlight(%-5level) %cyan(%logger{36}) - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- JDBCTemplate SQL 로그 설정 -->
    <logger name="org.springframework.jdbc.core" level="TRACE"/>
    <logger name="org.springframework.jdbc.core.JdbcTemplate" level="DEBUG"/>
    <logger name="org.springframework.jdbc.core.StatementCreatorUtils" level="TRACE"/>

    <root level="INFO">
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>

 

관련한 설정을 찾아보니 태그 3가지를 추가하면 원하는 로그를 남길 수 있어 기존 logback 설정파일 안에 설정 태그 3가지를 추가했다.

 

 

확인

보기 편한 편집을 통한 로그이미지
형광펜만 제거한 편집 이미지

 

보라색이 Filter를 통해 작성되는 로그, 노랑이 AOP를 통해 작성되는 로그, 초록색이 logback 설정을 통해 작성되는 로그이다. 이전보다 편하게 기능 오류를 잡아낼 수 있게 됐다.