본문으로 바로가기
반응형

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 값이 세팅되고

톰캣 설정에 의해 해당 요청들은 엑세스 로그가 남지 않게됩니다.

반응형