복붙노트

[SPRING] Spring MVC HandlerInterceptorAdapter를 사용하여 HttpServletResponse에서 응답 바디 로깅 (HTML) 로깅

SPRING

Spring MVC HandlerInterceptorAdapter를 사용하여 HttpServletResponse에서 응답 바디 로깅 (HTML) 로깅

나는 HttpServletResponse에 의해 반환 될 최종 렌더링 된 HTML을 기록하기 위해 노력하고있다. (즉, 본문)이 목적을 위해 Spring MVC에서 HandlerInterceptorAdapter를 사용하고있다.

public class VxmlResponseInterceptor extends HandlerInterceptorAdapter {
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println(response.toString());
    }
}

이것은 예상대로 작동하며 콘솔에 HTTP 응답 헤더가 표시됩니다. 내 질문은 PrintWriters, OutputStream 등으로 점핑 잭을 사용하지 않고 전체 응답 본문 (즉, 최종 렌더링 된 HTML)을 콘솔에 기록하는 비교적 간단한 방법이있는 경우입니다.

미리 감사드립니다.

해결법

  1. ==============================

    1.이것은 Spring HandlerInterceptor가 아닌 Servlet Filter를 사용하는 것이 더 좋을 것입니다. Filter가 요청 및 / 또는 응답 객체를 대체 할 수있는 이유 때문에이 메커니즘을 사용하여 응답을 기록하는 래퍼로 대체 할 수 있습니다 산출.

    이것은 Spring HandlerInterceptor가 아닌 Servlet Filter를 사용하는 것이 더 좋을 것입니다. Filter가 요청 및 / 또는 응답 객체를 대체 할 수있는 이유 때문에이 메커니즘을 사용하여 응답을 기록하는 래퍼로 대체 할 수 있습니다 산출.

    여기에는 HttpServletResponseWrapper의 서브 클래스를 작성하여 getOutputStream (및 getWriter ()도 가능)을 대체합니다. 이러한 메소드는, 원래의 행선지에 송신하는 것 외에, 응답 스트림을 사이펀해서 로그에 출력하는 OutputStream / PrintWriter 구현을 돌려줍니다. 이를 수행하는 쉬운 방법은 Apache Commons IO의 TeeOutputStream을 사용하는 것이지만, 구현하기는 어렵지 않습니다.

    다음은 일을 쉽게하기 위해 Spring의 GenericFilterBean과 DelegatingServletResponseStream, TeeOutputStream을 사용하여 할 수있는 일의 예입니다.

    public class ResponseLoggingFilter extends GenericFilterBean {
    
       @Override
       public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
          HttpServletResponse responseWrapper = loggingResponseWrapper((HttpServletResponse) response);     
          filterChain.doFilter(request, responseWrapper);
       }
    
       private HttpServletResponse loggingResponseWrapper(HttpServletResponse response) {
          return new HttpServletResponseWrapper(response) {
             @Override
             public ServletOutputStream getOutputStream() throws IOException {
                return new DelegatingServletOutputStream(
                   new TeeOutputStream(super.getOutputStream(), loggingOutputStream())
                );
             }
          };
       }
    
       private OutputStream loggingOutputStream() {
          return System.out;
       }
    }
    

    이렇게하면 모든 것이 STDOUT에 기록됩니다. 파일에 로깅하려면 스트림이 닫히는 등의 작업을 통해 훨씬 더 복잡해 지겠지만 원칙은 동일하게 유지됩니다.

  2. ==============================

    2.로깅 프레임 워크로 로그백을 사용하고 있다면 (또는 고려할 때), 정확하게 사용할 수있는 멋진 서블릿 필터가 이미 있습니다. 설명서에서 TeeFilter 장을 확인하십시오.

    로깅 프레임 워크로 로그백을 사용하고 있다면 (또는 고려할 때), 정확하게 사용할 수있는 멋진 서블릿 필터가 이미 있습니다. 설명서에서 TeeFilter 장을 확인하십시오.

  3. ==============================

    3.나는 잠시 동안 전체 HTTP 요청 / 응답을 기록하는 방법을 찾고 있었고 Tomcat 7 RequestDumperFilter에서 나를 위해 해결되었다는 것을 발견했다. Tomcat 7 컨테이너에서 광고 한대로 작동합니다. Jetty에서이 클래스를 사용하고 싶다면 클래스는 독립적으로 잘 작동합니다. 또는 내가했던 것처럼 내 환경의 특정 요구에 맞게 복사하고 적용 할 수 있습니다.

    나는 잠시 동안 전체 HTTP 요청 / 응답을 기록하는 방법을 찾고 있었고 Tomcat 7 RequestDumperFilter에서 나를 위해 해결되었다는 것을 발견했다. Tomcat 7 컨테이너에서 광고 한대로 작동합니다. Jetty에서이 클래스를 사용하고 싶다면 클래스는 독립적으로 잘 작동합니다. 또는 내가했던 것처럼 내 환경의 특정 요구에 맞게 복사하고 적용 할 수 있습니다.

  4. ==============================

    4.나는 maven central을 통해 작은 라이브러리 spring-mvc-logger를 만들었다.

    나는 maven central을 통해 작은 라이브러리 spring-mvc-logger를 만들었다.

    이 질문에 대답 :

    <dependency>
        <groupId>com.github.isrsal</groupId>
        <artifactId>spring-mvc-logger</artifactId>
        <version>0.2</version>
    </dependency>
    

    web.xml에 추가 :

    <filter>
        <filter-name>loggingFilter</filter-name>
        <filter-class>com.github.isrsal.logging.LoggingFilter</filter-class>
    </filter>
    
    <filter-mapping>
        <filter-name>loggingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    log4j.xml에 추가하십시오 :

    <logger name="com.github.isrsal.logging.LoggingFilter">
        <level value="DEBUG"/>
    </logger>
    
  5. from https://stackoverflow.com/questions/2158647/logging-response-body-html-from-httpservletresponse-using-spring-mvc-handlerin by cc-by-sa and MIT license