Spring BootでLogging用のFilterクラスを実装する

2016/07/26

静的ページ(JavaScriptやCSS等)は除いて、Spring Bootでリクエストを受けたものについて、以下をログに出力したい。

  • 処理開始時刻、処理終了時刻、処理時間
  • URL
  • すべてのリクエストパラメータ
  • レスポンスステータス

また、一つ一つのリクエストを一意に特定しやすくするため、ログインユーザ名とUUIDを組み合わせた文字列を、ログの先頭に識別子として必ず付与する。

検証version
  • Spring Boot 1.3.5
  • Selenium WebDriver 2.53.0
ソース

LoggingFilter.java

ソースコード解説
ログ項目の取得方法

処理開始時刻、処理終了時刻、処理時間は通常のJavaコードである。

URL、リクエストパラメータ、レスポンスステータスは、SpringのモジュールではなくJavaServletでおなじみのHttpServletRequest、HttpServletResponseを利用して取得する。

Loggerオブジェクト

Loggerオブジェクトを取得するためには、通常 private static final Logger log = LoggerFactory.getLogger(Sample.class); のようなコードを書く必要があるが、Lombokを使用しているため、 @Slf4j でクラスをアノテートすることで、logという名前の Loggerオブジェクトが使えるようなる。

Filter実装クラスのSpring Bootへの登録方法

@Component をFilter実装クラスにつけるだけで、Spring BootがFilterとして扱ってくれる。

今回はFilterはただ一つLoggingFilterのみを登録すればよかったのでこの方法を採っているが、Filter実装クラスを複数登録し、さらにFilterの実行順序を制御するのであれば、FilterRegistrationBeanを使用する必要があるだろう。

FilterRegistrationBeanの使用方法はこちらを参考:Spring Boot で複数の Filter を定義する

-Java
-