Spring Boot Embedded Tomcat을 사용하면 Access Log를 남길수 있습니다.
기본적으로는 비활성화 되어있고 server.tomcat.accesslog.enabled 옵션을 true로 주면 활성화 할 수 있습니다.
Access Log는 해당 서버로 들어오는 모든 요청들을 로깅하는데 이 중 로그로 남기고 싶지 않은 건들이 있을 수 있습니다.
저의 경우엔 외부 모니터링 서버에서 헬스체크를 위해 헬스체크 URL을 1초에 한번씩 호출했고, 엑세스 로그가 과도하게 남는 케이스였습니다.
톰캣 Access Log 스펙 중에, HttpServletRequest 객체의 Attribute 내 특정 키가 포함되있거나, 되있지 않을 경우 해당 요청에 대해서는 로깅을 하지 않도록 설정할 수 있는 기능이 있는데요.
아래 문서를 통해 톰캣 Access Log 동작 관련 설정 방식을 자세하게 알아볼 수 있습니다.
https://tomcat.apache.org/tomcat-8.5-doc/config/valve.html#Access_Log_Valve/Attributes
이 포스트에서는 스프링 부트 옵션을 통해 톰캣 Access Log 설정을 하고, 필터를 통해 구현한 사례를 소개합니다.
1. Spring Boot 옵션 설정
- server.tomcat.accesslog.enabled: 액세스로그 활성화
- server.tomcat.accesslog.condition-unless: 로그를 남기지 않을 대상 Request Attribute의 key 값.
예를들어 request.getAttribute("NO-LOG") != null 인 요청은 로그를 남기지 않음
server:
tomcat:
accesslog:
enabled: true
condition-unless: NO-LOG
2. Filter 구현
- Http 요청 객체의 Attribute를 추가하여 톰캣이 액세스 로그를 남기지 않도록하는 필터
- 파라미터로 전달받는 conditionUnlessKey는 server.tomcat.accesslog.condition-unless에 설정해둔 값 (NO-LOG) 이 전달되도록 외부에서 주입 예정
public class NonLogingMarkingFilter implement Filter {
private String conditionUnlessKey;
@Override
public void init(FilterConfig config) {
conditionUnlessKey = config.getInitParam("conditionUnlessKey");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException,
IOException {
request.setAttribute(conditionUnlessKey, conditionUnlessKey);
chain.doFilter(request, response);
}
}
3. 필터 등록
- 설정 파일 값을 주입받아 FilterRegistrationBean 통해 전달
- UrlPatterns에 로깅하지 않을 URL 목록을 설정하여 해당 요청들만 필터를 타도록 함
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
@Value("${server.tomcat.accesslog.condition-unless}")
private String conditionUnlessKey;
@Bean
public FilterRegistrationBean<NonLogingMarkingFilter> filterBean() {
FilterRegistrationBean<NonLogingMarkingFilter> filterBean = new FilterRegistrationBean<>(new NonLogingMarkingFilter());
filterBean.setOrder(Integer.MIN_VALUE);
filterBean.setUrlPatterns(List.of("url", "to", "ignore"));
filterBean.addInitParameter("conditionUnlessKey", conditionUnlessKey);
return filterBean;
}
}
위와 같이 구현하면 특정 URL의 요청들만 NonLogingMarkingFilter 타게 되어 Request Attribute에 conditionUnless 값이 세팅되고
톰캣 설정에 의해 해당 요청들은 엑세스 로그가 남지 않게됩니다.
'Back-End > Spring framework' 카테고리의 다른 글
| SSE를 활용해 웹에서 실시간 데이터 구독 기능 구현 (0) | 2022.05.15 |
|---|---|
| Spring Boot Managed Dependency 버전 변경 (0) | 2022.04.08 |
| Docker Compose 를 이용해 Spring Boot + MySQL 서비스 구축 (기초) (0) | 2022.01.17 |
| Spring Boot 애플리케이션 Docker 컨테이너로 배포 (기초) (0) | 2022.01.16 |
| [짧은정리] Gradle Multi Module 구성 시 참고사항 (0) | 2021.12.11 |