코딩항해기
[Team/붕어빵원정대(최프)] 로그 관리 본문
필요성
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 계획 단계에 들어가 있어 추가 작업이 필요없었으며 색상을 통해 구분이 쉽도록 작업해두었다.
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 요청이 시작 될 때마다 시작로그를 찍게되며, 모든 요청이 끝나면 후처리를 거쳐 끝 로그를 찍고 나서 응답하게 된다.
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 설정을 통해 작성되는 로그이다. 이전보다 편하게 기능 오류를 잡아낼 수 있게 됐다.
'Project' 카테고리의 다른 글
[Team/붕어빵원정대(최프)] 팀 프로젝트 git 관리 (1) | 2024.11.07 |
---|---|
[Team/붕어빵원정대(최프)] 최종 프로젝트 (git, notion) (1) | 2024.11.06 |
[Team/붕어빵원정대(최프)] Model파트 DAO 오류해결 기록 (0) | 2024.10.27 |
[Team/붕어빵원정대(최프)] 기능 검증 및 종단 개발 방식 병행 시작 (0) | 2024.10.26 |
[Team/붕어빵원정대(최프)] Model와 설계 조율 (2) (0) | 2024.10.24 |