環境
- SpringBoot3.1.1
- Java17
IPAddressFilter
このコードは、IPアドレスをログに出力するためのカスタムフィルターを定義しています。
IPAddressFilterクラスはOncePerRequestFilterを継承し、リクエストごとに一度だけフィルタリングを行います。
リクエストからIPアドレスを取得し、MDC(Mapped Diagnostic Context)に設定します。そして、フィルタリングの後はMDCをクリアしてリソースを解放します。
import java.io.IOException;
import org.slf4j.MDC;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@Component
public class IPAddressFilter extends OncePerRequestFilter {
private static final String IP_ADDRESS_MDC_KEY = "ipAddress";
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
try {
// IPアドレスを取得してMDCに設定
String ipAddress = request.getRemoteAddr();
MDC.put(IP_ADDRESS_MDC_KEY, ipAddress);
// 次のフィルター(またはリクエストの処理)を呼び出す
filterChain.doFilter(request, response);
} finally {
// MDCをクリアしてリソースを解放
MDC.remove(IP_ADDRESS_MDC_KEY);
}
}
}
MvcConfig
このコードは、IPAddressFilterをWebMvcConfigurerに登録するための設定クラスを定義しています。
MvcConfigクラスでIPAddressFilterをBeanとして登録し、全てのURLパスに対してこのフィルターが適用されるように設定しています。
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import test.project.IPAddressFilter;
public class MvcConfig implements WebMvcConfigurer {
@Bean
public FilterRegistrationBean filterRegister() {
FilterRegistrationBean bean = new FilterRegistrationBean(new IPAddressFilter());
bean.addUrlPatterns("/*");
return bean;
}
}
logback-spring.xml
ログの出力パターンを変更してIPアドレスをログに出力するための設定です。
%X{ipAddress}という記述をログの出力パターンに追加しています。これにより、ログにIPアドレスが出力されるようになります。
<encoder>
<charset>UTF-8</charset>
<!--出力内容 -->
<!-- <pattern>${FILE_LOG_PATTERN}</pattern> -->
<pattern>%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr(${LOGGED_APPLICATION_NAME:-}[%15.15t]){faint} %clr(${LOG_CORRELATION_PATTERN:-}){faint}%clr(%-40.40logger{39}){cyan} %clr(:){faint} [%X{ipAddress}] %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}</pattern>
</encoder>
ログ出力例:
log.info("ログメッセージ");
変更前:
2023-08-05T00:00:00.000+09:00 INFO 45428 --- [nio-8080-exec-1] test.project.controller.TestController : ログメッセージ
変更後:
2023-08-05T00:00:00.000+09:00 INFO 46888 --- [nio-8080-exec-1] test.project.controller.TestController : [0:0:0:0:0:0:0:1] ログメッセージ
以上です。
コメント