2012-09-11 32 views
10

Chúng tôi có các dịch vụ REST được hiển thị qua Spring MVC. Chúng tôi sử dụng HandlerExceptionResolver để đăng nhập ngoại lệ. Chúng tôi hiện đang đăng nhập như sau:Tôi làm cách nào để ghi lại dữ liệu bài đăng RESTful?

  • Trường hợp ngoại lệ và dấu vết ngăn xếp của nó
  • URL
  • Các tiêu đề yêu cầu

Nó sẽ làm cho gỡ lỗi dễ dàng hơn nếu chúng ta cũng có thể ghi lại các dữ liệu JSON bài như tốt. Bất kỳ đề xuất về cách để có được điều này?

Trả lời

10

Bạn cần một bộ lọc có thể lưu cơ thể yêu cầu khi nó được đọc và cung cấp dữ liệu đã lưu cho trình ghi nhật ký ngoại lệ của bạn sau này.

Mùa xuân chứa AbstractRequestLoggingFilter cũng giống như vậy. Mặc dù nó không trực tiếp phù hợp với vấn đề của bạn, bạn có thể sử dụng nó như là một tham chiếu để thực hiện bộ lọc của riêng bạn.

+1

Nếu bạn đang sử dụng Spring 4.1.3+ (xem SPR-12.477), hãy chắc chắn để lập bản đồ bộ lọc của bạn để MVC Dispatcher Servlet của bạn và không cho '/* 'hoặc yêu cầu của bạn sẽ không được gói trong' ContentCachingRequestWrapper' cần thiết. –

+1

@ LászlóvandenHoek, Bạn có thể xây dựng không? Tôi không theo bạn. Tôi đang sử dụng 'ContentCachingRequestWrapper', nhưng phần thân yêu cầu luôn là một chuỗi rỗng. Bộ lọc –

+0

@AbhijithMadhav được bật bằng cách ánh xạ chúng tới mẫu URL hoặc servlet. Điều tôi muốn nói là bạn cần đảm bảo rằng bạn ánh xạ 'AbstractRequestLoggingFilter' của mình thành điều phối viên, không phải là mẫu URL'/* '. –

4

Không có cách nào dễ dàng để ghi lại tải trọng của yêu cầu/phản hồi. Bạn có thể sử dụng bộ lọc web java để chặn tất cả các yêu cầu và phản hồi và đọc dữ liệu JSON từ luồng. Nhưng có một vấn đề, khi bạn sẽ đọc dữ liệu từ luồng dữ liệu thực tế sẽ cạn kiệt từ luồng.

Vì vậy, bạn phải triển khai trình bao bọc của đối tượng yêu cầu và phản hồi thực tế. Chỉ phiên bản phản hồi yêu cầu được sao chép mới được ghi lại. Chúng tôi đã thực hiện giải pháp tương tự như sau và nó thỏa mãn yêu cầu của chúng tôi:

http://www.wetfeetblog.com/servlet-filer-to-log-request-and-response-details-and-payload/431

http://angelborroy.wordpress.com/2009/03/04/dump-request-and-response-using-javaxservletfilter/

16

Thêm phần này vào lớp đại diện cho các cấu hình cho các ứng dụng:

import javax.servlet.Filter; 
import javax.servlet.http.HttpServletRequest; 
import org.springframework.web.filter.AbstractRequestLoggingFilter; 

....

@Bean 
public Filter loggingFilter(){ 
    AbstractRequestLoggingFilter f = new AbstractRequestLoggingFilter() { 

     @Override 
     protected void beforeRequest(HttpServletRequest request, String message) { 
      System.out.println("beforeRequest: " +message); 
     } 

     @Override 
     protected void afterRequest(HttpServletRequest request, String message) { 
      System.out.println("afterRequest: " +message); 
     } 
    }; 
    f.setIncludeClientInfo(true); 
    f.setIncludePayload(true); 
    f.setIncludeQueryString(true); 

    f.setBeforeMessagePrefix("BEFORE REQUEST ["); 
    f.setAfterMessagePrefix("AFTER REQUEST ["); 
    f.setAfterMessageSuffix("]\n"); 
    return f; 
} 

bạn có thể phải nhận xét ra

f.setIncludePayload(true); 
Các vấn đề liên quan