2016-03-07 9 views
10

Spring Boot ActuatorのTraceは、入出力HTTPのパラメータ、ヘッダ、ユーザなどをキャプチャするのに適しています。HTTPレスポンスの本体をキャプチャするように拡張したいのです。何がウェブレイヤーに入ったり出たりしているのかを知ることができます。 TracePropertiesを見ると、レスポンスボディキャプチャを設定する方法がないように見えます。レスポンスボディをキャプチャするための "安全な"方法はありますか?Spring起動アクチュエータのトレースにJSONレスポンス本文を含めるには?

答えて

2

最近、私は春ブーツアクチュエータのtraceエンドポイントのカスタマイズについてblog postを書いて、アクチュエータで遊んでいる間、私はresponse bodyをトレースするサポート特性の一つではないことをちょっと驚きました。

私はこの機能が必要かもしれないと思って、LogbackのTeeFilterのおかげで簡単に解決策を考え出しました。

応答の出力ストリームを複製するには、あまり検討することなくTeeHttpServletResponseTeeServletOutputStreamをコピーして使用しました。あなたはtraceエンドポイントがありますJSONでresponseBodyを見ることができ、今

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

その後、私はブログの記事で説明したと同じように、のようなWebRequestTraceFilterを拡張しました。

+0

この回答を使用しようとしました。上記の2つのクラスTeeHttpServletResponseとTeeServletOutputStreamから正確なコードをコピーしました。 Now/traceは、 "応答がコミットされた後にsendError()を呼び出せません"というメッセージを500回表示し、他のリソースは "文法エラー"という本文を200回与えてくれます。春のログでは、私はエラーを見ることができません – isADon

関連する問題