Spring Boot Aktüatörü Trace
giriş/çıkış HTTP param, başlık, kullanıcı, vb. Yakalamak için iyi bir iş yapar. Ayrıca, HTTP yanıtının gövdesini yakalamak için genişletmek istiyorum. web katmanına giren ve çıkan şey. TraceProperties
'a bakıldığında, yanıt gövdesinin yakalanmasını yapılandırmanın bir yolu var gibi görünmüyor. Cevap gövdesini geri göndermekte olan karakter akışını bozmadan yakalamak için "güvenli" bir yol var mı?Spring Boot Aktüatörün İzine JSON yanıt gövdesi nasıl eklenir?
10
A
cevap
2
Son zamanlarda, Bahar Boot aktüatör en trace
son nokta özelleştirmesiyle ilgili bir blog post yazmış ve Aktüatör oynarken, ben response body
izlemek için desteklenen özelliklerin biri olmadığını tür şaşırdı.
Bu özelliğe ihtiyacım olabileceğini düşündüm ve Logback'in TeeFilter
'u sayesinde hızlı bir çözüm buldum. Yanıtın çıktı akışını çoğaltmak için, çok fazla inceleme yapmadan TeeHttpServletResponse ve TeeServletOutputStream kopyaladım ve kullandım. Eğer trace
bitiş noktası hizmet veren JSON responseBody
görebilirsiniz, Şimdi
@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;
}
}
:
Sonra ben blog yayınında açıklandığı gibi, gibi WebRequestTraceFilter
uzatıldı.
Bu cevabı kullanmayı denedim. Tam kodu yukarıdan ve iki sınıftan TeeHttpServletResponse ve TeeServletOutputStream kopyalayın. Şimdi/trace bana "Response yanıtı verildikten sonra sendError() öğesini çağırılamıyor" ve "diğer herhangi bir kaynak bana" sözdizimi hatası "ile 200 verir. Bahar kayıtlarında herhangi bir hata göremiyorum – isADon