環境
- 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<IPAddressFilter> filterRegister() { FilterRegistrationBean<IPAddressFilter> bean = new FilterRegistrationBean<IPAddressFilter>(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] ログメッセージ
以上です。
コメント