2
3

More than 3 years have passed since last update.

リクエストパラメータのログ出力サンプル Java & SpringMVC

Posted at

前書き

SpringMVCを使用していて、
リクエストURLやリクエストパラメータをログに出したい!
ということが度々あり、その度に専用のfilterクラスを作っていたので、

いっそ自分のために記事に残しておいたら今後幸せになれるのでは?

と思い記載しました。完全に自分用のメモです。

環境

  • Java 8 (11でも動きます)
  • Spring Boot 2.2.1
  • Spring MVC (バージョンはBootの規定を使用)
  • Lombok (バージョンはBootの規定を使用)

※Spring WebFluxでは試していません。

コードサンプル

package com.example.demo.filter;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;

@Slf4j
@Component
public class LoggingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpReq = ((HttpServletRequest)request);
        String uri = httpReq.getRequestURI();

        long start = System.currentTimeMillis();
        log.info(String.format("処理開始. URI: %s", uri));

        // リクエストパラメータを加工して1行のログとして出力する
        Map<String, String[]> params = httpReq.getParameterMap();
        StringBuilder strParams = new StringBuilder("リクエストパラメータ: [");
        boolean isFirstParam = true;
        for (Map.Entry<String, String[]> param : params.entrySet()) {
            if (isFirstParam) {
                isFirstParam = false;
            } else {
                // リクエストパラメータの2個目以降の場合は連結子としてカンマを付与する
                strParams.append(", ");
            }
            strParams.append(param.getKey()).append("=").append(Arrays.toString(param.getValue()));
        }
        strParams.append("]");
        log.info(strParams.toString());

        // 各処理実施
        chain.doFilter(request, response);

        int status = ((HttpServletResponse) response).getStatus();
        log.info(String.format("処理終了. 所要時間 %d millis. STATUS=%d", System.currentTimeMillis() - start, status));
    }

    @Override
    public void destroy() {
    }
}

ログサンプル

2019-11-14 11:54:40.297  INFO 2001 --- [nio-8080-exec-1] com.example.demo.filter.LoggingFilter    : 処理開始. URI: /demo/hello
2019-11-14 11:54:40.298  INFO 2001 --- [nio-8080-exec-1] com.example.demo.filter.LoggingFilter    : リクエストパラメータ: [hoge=[1], fuga=[2]]
2019-11-14 11:54:40.327  INFO 2001 --- [nio-8080-exec-1] com.example.demo.filter.LoggingFilter    : 処理終了. 所要時間 30 millis. STATUS=200

補足

ログフォーマットはSpringBootの規定のままです。
個人的にログ出力は日本語だとわかりやすいため、日本語で記載しています。もうちょっとこうしたほうがいいかな…と思うこともありますが、このような文体で記載することが多いです。
若干拡張For文のあたりがキモいな…と思わなくもないですが、めんどくさくて改定していないです。

なお、このFilterでは配列のパラメータは対応していますが、添付ファイルには対応していません。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3