복붙노트

[SPRING] Spring Boot Actuator Trace에 JSON 응답 본문을 포함시키는 방법?

SPRING

Spring Boot Actuator Trace에 JSON 응답 본문을 포함시키는 방법?

스프링 부트 액츄에이터의 추적 기능은 입출력 HTTP 매개 변수, 헤더, 사용자 등을 캡쳐하는 작업을 잘 수행합니다. HTTP 응답의 본문을 캡처하도록 확장하고 싶습니다. 그런 식으로 전체 내용을 볼 수 있습니다. 웹 레이어에서 들어오고 나간다. TraceProperties를 보면 응답 본문 캡처를 구성하는 방법이없는 것처럼 보입니다. 답신 본문을 다시 보내려는 문자 스트림을 망쳐 놓지 않고 응답 본문을 캡처하는 "안전한"방법이 있습니까?

해결법

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

    1.최근 스프링 부트 액추에이터의 추적 끝점을 사용자 정의하는 블로그 게시물을 작성했으며 액추에이터를 가지고 노는 동안 응답 바디가 추적 할 수있는 지원되는 속성 중 하나가 아닌 것에 놀랐습니다.

    최근 스프링 부트 액추에이터의 추적 끝점을 사용자 정의하는 블로그 게시물을 작성했으며 액추에이터를 가지고 노는 동안 응답 바디가 추적 할 수있는 지원되는 속성 중 하나가 아닌 것에 놀랐습니다.

    이 기능이 필요할 수도 있고 Logback의 TeeFilter 덕분에 빠른 해결책을 찾았습니다.

    응답의 출력 스트림을 복제하기 위해 너무 많은 시험없이 TeeHttpServletResponse 및 TeeServletOutputStream을 복사하여 사용했습니다.

    그런 다음 블로그 게시물에서 설명한 것처럼 확장 된 WebRequestTraceFilter는 다음과 같습니다.

    @Component
    public class RequestTraceFilter extends WebRequestTraceFilter {
    
        RequestTraceFilter(TraceRepository repository, TraceProperties properties) {
            super(repository, properties);
        }
    
        @Override
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
            TeeHttpServletResponse teeResponse = new TeeHttpServletResponse(response);
    
            filterChain.doFilter(request, teeResponse);
    
            teeResponse.finish();
    
            request.setAttribute("responseBody", teeResponse.getOutputBuffer());
    
            super.doFilterInternal(request, teeResponse, filterChain);
        }
    
        @Override
        protected Map<String, Object> getTrace(HttpServletRequest request) {
            Map<String, Object> trace = super.getTrace(request);
    
            byte[] outputBuffer = (byte[]) request.getAttribute("responseBody");
    
            if (outputBuffer != null) {
                trace.put("responseBody", new String(outputBuffer));
            }
    
            return trace;
        }
    }
    

    이제 JSON 추적 엔드 포인트에서 responseBody가 작동하는 것을 볼 수 있습니다.

  2. from https://stackoverflow.com/questions/35848802/how-to-include-json-response-body-in-spring-boot-actuators-trace by cc-by-sa and MIT license