JakartaEE フィルタでログ記録を実装する方法!初心者向けにサーブレットのリクエスト監視を解説
生徒
「先生、JakartaEEでリクエストを全部記録して、どのページにアクセスされたかを確認する方法ってありますか?」
先生
「それならサーブレットフィルタを使うのが便利だよ。フィルタを通してすべてのリクエストを横取りして、ログに残すことができるんだ。」
生徒
「横取りってちょっと怖い感じがしますけど、実際にはどういう仕組みなんですか?」
先生
「フィルタはサーブレットの前後に処理を差し込める仕組みで、アクセスURLや処理時間を記録するのにとても役立つんだよ。」
1. ログ記録フィルタを作る目的
JakartaEEアプリケーションでは、リクエストやレスポンスを監視してログに残すことが重要です。例えば、誰がどのページにアクセスしたのか、どれくらい時間がかかったのかを把握できれば、セキュリティ対策やパフォーマンス改善に役立ちます。こうした処理を個々のサーブレットに直接書いてしまうと重複が増えるため、共通処理としてフィルタにまとめるのが効率的です。
2. ログ記録用フィルタの基本構造
フィルタを作成するには、Filterインターフェースを実装し、doFilterメソッドの中でログ処理を行います。例えば、アクセスURLと処理時間を記録するシンプルな例を見てみましょう。
@WebFilter("/*")
public class LoggingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
long start = System.currentTimeMillis();
chain.doFilter(request, response);
long end = System.currentTimeMillis();
System.out.println("アクセスURL: " + req.getRequestURI() + " 処理時間: " + (end - start) + "ms");
}
}
このコードでは、すべてのリクエストに対してURLと処理時間を出力しています。これにより、どのページが遅いのかを簡単に把握できます。
3. ログ内容を拡張する
ログに残す情報はURLや処理時間だけではなく、クライアントのIPアドレスやHTTPメソッドも追加できます。これにより、より詳細なアクセス解析が可能になります。
String ip = req.getRemoteAddr();
String method = req.getMethod();
System.out.println("IP: " + ip + " メソッド: " + method + " URL: " + req.getRequestURI());
このようにすると、誰がどの操作を行ったのかを追跡できるため、セキュリティログとしても役立ちます。
4. 実行結果の例
フィルタを通してリクエストを記録すると、コンソールに以下のようなログが出力されます。
アクセスURL: /app/home 処理時間: 25ms
IP: 127.0.0.1 メソッド: GET URL: /app/home
このようなログが残ることで、開発者はアプリケーションの利用状況を簡単に確認できます。
5. ログをファイルに保存する
実際の運用では、コンソールではなくログファイルに保存するのが一般的です。JavaのLoggerクラスを使えば、ファイル出力やレベル別の管理が可能です。
private static final Logger logger = Logger.getLogger(LoggingFilter.class.getName());
logger.info("アクセスURL: " + req.getRequestURI());
ログをファイルに残すことで、後からアクセス履歴を分析したり、不正アクセスの痕跡を追跡することができます。
6. ログフィルタを導入するメリット
JakartaEEでログフィルタを導入すると、次のようなメリットがあります。
- アプリケーション全体のリクエストを一括で監視できる
- エラートラブルの調査が容易になる
- セキュリティ監査に役立つ情報が得られる
- 処理時間を分析してボトルネックを発見できる
このように、フィルタを使ったログ記録は初心者にも取り組みやすく、しかも大規模システムにも役立つ実践的な方法です。
7. 実運用での注意点
ログを記録する際には注意点もあります。大量のアクセスをすべて記録すると、ログファイルが肥大化してサーバーに負担をかける可能性があります。そのため、重要な情報に絞って出力する、ログローテーションを設定するなどの工夫が必要です。また、個人情報やパスワードなどを誤ってログに出力しないよう、記録内容には十分気をつけましょう。
まとめ
JakartaEEフィルタによるログ記録の重要ポイントを振り返る
この記事では、JakartaEEにおけるサーブレットフィルタを使ったログ記録の実装方法について、初心者にも分かりやすく解説してきました。 フィルタは、リクエストがサーブレットやコントローラに到達する前後に共通処理を差し込める仕組みであり、 アプリケーション全体のリクエスト監視やレスポンス処理を一元管理できる点が大きな特徴です。 特にログ記録のような横断的な処理は、フィルタで実装することでコードの重複を防ぎ、保守性の高い設計を実現できます。
JakartaEEのWebアプリケーションでは、どのURLにどのくらいの頻度でアクセスがあったのか、 処理に時間がかかっている画面はどこなのか、といった情報を把握することがとても重要です。 フィルタを使ってリクエストURL、HTTPメソッド、クライアントのIPアドレス、処理時間などをログに残すことで、 アプリケーションの利用状況やパフォーマンスの傾向を客観的に分析できるようになります。 これは障害調査やチューニング、セキュリティ対策を行ううえで欠かせない基礎知識です。
記事内で紹介したように、Filterインターフェースを実装し、doFilterメソッドの中で
ログ出力処理を行うことで、すべてのリクエストをまとめて監視できます。
chain.doFilter()の前後に処理を記述することで、リクエスト前後の情報を記録できる点も重要なポイントです。
処理開始時刻と終了時刻を取得することで、処理時間を計測できるため、
ボトルネックの特定や性能改善にも役立ちます。
また、実運用ではコンソール出力ではなく、ログファイルへの保存が一般的です。
JavaのLoggerやログフレームワークを利用すれば、ログレベルの制御やローテーション設定が可能になり、
大量アクセスのあるシステムでも安定した運用ができます。
ただし、すべての情報を無制限に記録するとサーバー負荷が高まるため、
本当に必要な情報に絞って出力する設計が重要です。
個人情報や認証情報を不用意にログへ出力しないことも、セキュリティ面で必ず意識すべきポイントです。
JakartaEEのフィルタを使ったログ記録は、初心者が最初に取り組む実践的なサーバーサイド開発のテーマとして非常に適しています。 リクエストの流れやWebアプリケーションの内部構造を理解する助けにもなり、 今後セキュリティフィルタや認証フィルタ、文字エンコーディング設定などを学ぶ際の土台にもなります。 今回学んだ内容をベースに、より高度なログ設計や監視機能へとステップアップしていきましょう。
ログ記録フィルタの最終確認サンプル
ここで、リクエストURLと処理時間を記録するシンプルなログフィルタの例をあらためて確認します。 JakartaEEにおけるフィルタの基本構造を理解するうえで、とても分かりやすいサンプルです。
@WebFilter("/*")
public class LoggingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
long start = System.currentTimeMillis();
chain.doFilter(request, response);
long end = System.currentTimeMillis();
System.out.println("URL: " + req.getRequestURI() + " 処理時間: " + (end - start) + "ms");
}
}
このようなフィルタを導入するだけで、アプリケーション全体のアクセス状況を簡単に可視化できます。 小さなサンプルですが、実務でもそのまま応用できる重要な考え方が詰まっています。
生徒
「フィルタを使うと、全部のリクエストをまとめてログに残せるんですね。 サーブレットごとに書かなくていいのが便利だと感じました。」
先生
「その通りだよ。共通処理はフィルタにまとめるのがJakartaEEらしい設計なんだ。」
生徒
「URLや処理時間が分かると、どこが遅いのかも見えてきそうですね。」
先生
「うん。ログは不具合調査や性能改善の強い味方になるから、早いうちに慣れておくといいよ。」
生徒
「次は認証チェックやアクセス制御もフィルタでやってみたいです。」
先生
「いい目標だね。今回のログフィルタの理解が、そのまま次の学習につながるよ。」
JakartaEEのフィルタによるログ記録は、Webアプリケーション開発の基礎と実務の両方に直結する重要なテーマです。 今回のまとめを参考に、自分のアプリケーションでも実際にログフィルタを作成し、動作を確認してみましょう。 実際に手を動かすことで、理解はさらに深まっていきます。