2017-09-11 50 views
0

我正在使用spring引導來處理其他api。我需要使用輸入參數記錄所有請求(使用方法,例如GET,POST等),請求Url,查詢字符串,以及此操作的響應,成功和錯誤以及狀態碼。Spring引導日誌記錄Http通信

我不僅需要記錄傳入的https請求/響應,還要傳出https請求/響應。 我必須用json格式記錄請求/響應。 你能告訴我春季最好的做法來達到這個目的嗎?

+0

你使用嵌入式碼頭或外部tomcat? –

+0

我使用外部的tomcat。 – NAZEHA

+0

您正在使用哪個HTTP客戶端? –

回答

0

通常這可以通過使用servlet filter來完成。一個servlet過濾器「攔截」了進入的請求,並且響應就出來了。您可以從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,它允許您多次讀取請求內容。