前書き
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では配列のパラメータは対応していますが、添付ファイルには対応していません。