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 |