2017-09-11 2 views
0

스프링 부트로 나머지 API 작업을하고 있습니다. 입력 매개 변수 (예 : GET, POST 등)를 사용하여 요청을 모두 기록하고 URL, 쿼리 문자열을 요청하고이 작업의 응답, 성공과 오류 및 상태 코드도 모두 기록해야합니다.스프링 부트 로깅 Http 통신

는 난 단지 HTTPS 요청/응답 들어오는뿐만 아니라 HTTPS 요청/응답을 보내는하지 로그인해야합니다. 요청/응답을 json 형식으로 기록해야합니다. 이것을 달성하기 위해 봄에 가장 좋은 방법을 말해 줄 수 있습니까? 구체적인 예를 들어주십시오.

+0

임베디드 부두 또는 외부 바람둥이를 사용하고 있습니까? –

+0

외부 바람둥이를 사용하고 있습니다. – NAZEHA

+0

어떤 HTTP 클라이언트를 사용하고 있습니까? –

답변

0

보통 이것은 servlet filter을 사용하여 수행 할 수 있습니다. 서블릿 필터는 요청을 "차단 (intercept)"하고 그 응답은 빠져 나갑니다. HttpServletRequest 및 HttpServletResponse에서 필요한 모든 정보에 액세스하여 원하는대로 로그 할 수 있습니다.

간단한 예 :

public class LoggingFilter implements javax.servlet.Filter { 

private static final Logger LOGGER = LoggerFactory.getLogger(LoggingFilter.class); 

@Override 
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
    HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; 
    HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse; 

    // log information from the httpServletRequest like url, params, etc 
    filterChain.doFilter(servletRequest, servletResponse); 
    // log information regarding the httpServletResponse like status code, etc 
} 
} 

은 @ SpringBootApplication - 주석 클래스의 필터를 등록 :

@Bean 
public FilterRegistrationBean loadBalancerHealthCheckHandler() { 
    FilterRegistrationBean registration = new FilterRegistrationBean(); 
    registration.setFilter(new LoggingFilter()); 
    registration.addUrlPatterns("/*"); 
    return registration; 
} 
+0

감사합니다 jorgen.ringen. 들어오는 요청에 이것을 사용할 수는 있지만 요청을 차단하는 방법은 무엇입니까? – NAZEHA

+0

좋은 시작입니다. 이것은 또한 현재 내가 어떻게 성취하는지 보여줍니다. 그러나 Spring MVC보다 먼저 요청 본문에 접근하는 데 문제가있다. HttpServletRequest는 InputStream을 통해 요청 본문을 한 번 기침합니다. 요청 본문을 여러 번 액세스 할 수 있도록 캐시하려면 몇 가지 기술을 수행해야합니다. –

1

당신은 쿼리 문자열, 헤더와 본문 내용을 기록하는 데 사용할 수있는 org.springframework.web.filter.CommonsRequestLoggingFilter 전과가있다 요청 후.

// filter will be applied to all paths 
@Bean 
public CommonsRequestLoggingFilter loggingFilter() { 
    CommonsRequestLoggingFilter filter = new CommonsRequestLoggingFilter(); 
    filter.setIncludeQueryString(true); 
    filter.setIncludeHeaders(true); 
    filter.setIncludePayload(true); 
    filter.setMaxPayloadLength(1000); // default is 50 bytes 
    return filter; 
} 

몇 가지 추가 설정이 있습니다. 또한이 구현이 적합하지 않은 경우 org.springframework.web.filter.AbstractRequestLoggingFilter에서 상속하고 메서드를 재정 의하여 요구 사항을 충족시킬 수 있습니다.

org.springframework.web.util.ContentCachingRequestWrapper을 사용하면 요청 내용을 여러 번 읽을 수 있습니다.