2012-09-11 24 views
10

Spring MVC üzerinden REST hizmetlerine maruz kalıyoruz. İstisnaları kaydetmek için HandlerExceptionResolver kullanıyoruz.RESTful posta verilerini nasıl kaydedebilirim?

  • istisna ve yığın izleme
  • URL
  • istek başlıklarını

biz de olarak JSON sonrası verileri günlüğe eğer daha kolay ayıklama yapar: Şu anda aşağıdaki log iyi. Bunu nasıl alacağınıza dair herhangi bir öneriniz var mı?

cevap

10

Bunu okumak ediliyor istek gövdesini kaydedip daha sonra istisna günlükçüsüne kaydedilen verileri sağlayacak bir filtre gerekir.

Bahar benzer şeyi yapar AbstractRequestLoggingFilter içerir. Sorununuz için doğrudan uygun olmasa da, kendi filtrenizi uygulamak için referans olarak kullanabilirsiniz.

+1

açıklama gerekebilir 4.1.3+, sizin MVC Dispatcher Servlet Filtrenizi haritaya dikkat edin ve (SPR-12477 bakınız) değil '/* 'veya isteğiniz asıl 'ContentCachingRequestWrapper' seçeneğine sarılmayacak. –

+1

@ LászlóvandenHoek, Detaylandırır mısınız? Ben seni takip etmiyorum 'ContentCachingRequestWrapper' kullanıyorum, ancak istek gövdesi her zaman boş bir dizedir. –

+0

@AbhijithMadhav filtreleri, bunları bir URL kalıbı veya bir sunucuya eşleştirerek etkinleştirilir. Demek istediğim, '/ *' URL modeline değil, 'AbstractRequestLoggingFilter' öğesini göndericinize eşlediğinizden emin olmanız gerektiğiydi. –

4

istek/yanıt yükünü log kolay bir yolu yoktur. Tüm istekleri ve yanıtları engellemek ve akıştan JSON verilerini okumak için bir java web filtresi kullanabilirsiniz. Ama bir problem var, veriyi akıştan okuyacağınız zaman, gerçek veriler akıştan tüketilecektir.

Bu nedenle, gerçek istek ve tepki nesnenin ambalajı uygulamak zorunda. Yalnızca kopyalanan istek yanıtı sürümü günlüğe kaydedilir. aşağıdaki gibi biz benzer bir çözüm uyguladık ve bizim gereksinimi memnun:

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

uygulama yapılandırmasını temsil eden sınıfa ekleyin:

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; 
} 

Eğer bahar kullanıyorsanız

f.setIncludePayload(true); 
İlgili konular