カスタムヘッダーも簡単に設定可能
SpringBootを使ってAPI開発をしている場合、簡単にレスポンスヘッダーへ独自項目を追加する事が可能です。
今回は以前の記事でログに含めるために発行したX-Request-IDを、全リクエスト時のレスポンスヘッダーに自動で追加する方法をご紹介致します。
関連記事
【SpringBoot2】UUIDを自動採番してX-Request-Idとしてlogbackのログに埋め込む方法【MDC】
IT
Java
Mac
Windows
アプリケーション例えば、アプリから呼ばれるAPIなどのシステムの場合は、お問い合わせ時やシステムエラーのフィードバック時にサーバーから返ってきたX-Request-IDを含ませる事で、容易にサーバーログを絞る事が出来るためよりスピーディーにログ調査が行えます。
手順
OncePerRequestFilterを継承したFilterクラスを実装
まずは、前回のフィルターで発行されたX-Request-IdをMDCから取得し、レスポンスヘッダーに追加するFilterクラスを実装しましょう。
package tech.blogenist.service.account.api.infrastructure.filter.x_request_id;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.MDC;
import org.springframework.web.filter.OncePerRequestFilter;
public class ResponseHeaderAddXRequestIdFilter
extends OncePerRequestFilter
{
@Override
protected void doFilterInternal( HttpServletRequest request, HttpServletResponse response, FilterChain filterChain )
throws ServletException, IOException
{
String xRequestId = MDC.get( MdcXRequestIdFilter.KEY );
response.setHeader( MdcXRequestIdFilter.KEY, xRequestId );
filterChain.doFilter( request, response );
}
}
ConfigurationクラスでBean定義
次に、前回作ったConfigurationクラスにて新たにBeanとして追加しましょう。
package tech.blogenist.service.account.api.infrastructure.filter.x_request_id;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class XRequestIdFilterConfig
{
@Bean
public MdcXRequestIdFilter mdcXRequestIdFilter()
{
MdcXRequestIdFilter filter = new MdcXRequestIdFilter();
return filter;
}
//追加
@Bean
public ResponseHeaderAddXRequestIdFilter responseHeaderAddXRequestIdFilter()
{
ResponseHeaderAddXRequestIdFilter filter = new ResponseHeaderAddXRequestIdFilter();
return filter;
}
}
準備はこれだけです!
確認
では、実際に確認してみましょう。
#サーバーログ
[DEBUG] [23e55d17-7d0c-4a8c-82e6-256df17b670a] [2019-05-01 15:26:34.619] [o.h.engine.internal.TwoPhaseLoad] - Done materializing entity [tech.blogenist.service.account.entity.db.account.CurrentAccountInfomationsTableEntity#component[value]{value=10001}]
# レスポンスヘッダー
< HTTP/1.1 200
< x-request-id: 23e55d17-7d0c-4a8c-82e6-256df17b670a
< Content-Type: application/json;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Wed, 01 May 2019 06:26:34 GM
サーバーログのX-Request-IDとレスポンスヘッダーのX-Request-IDの値が同じになっていますね♪
もちろん、独自エラーのスロー時やシステムエラー時にもレスポンスヘッダーに追加されているので調査が捗りそうです。
オススメの商品
終わりに
以上のように、簡単なクラスを追加するだけでログ調査が何倍もやりやすくなります。
何も仕込んでないログを漁るのは地獄なので、是非X-Request-IDを仕込んでみてください♪
