本ブログはアフィリエイト広告を利用しています。

SpringBoot3.1 ログにIPアドレスを出力する

環境

  • 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>

ログパターンは以下を参照
https://github.com/spring-projects/spring-boot/blob/main/spring-boot-project/spring-boot/src/main/resources/org/springframework/boot/logging/logback/defaults.xml

ログ出力例:

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] ログメッセージ

以上です。

コメント

タイトルとURLをコピーしました