【Laravel】ミドルウェアを使ってアクセスログを10分で実装する方法

2021年10月19日

こんにちは。今回はミドルウェアを使用してアクセスログを実装する方法を解説します。

ミドルウェアとは

ミドルウェアとはアプリケーションに入る前に共通的な処理を書くことができる機能です。アプリケーションとユーザーの中間に位置するのでミドルウェアと呼ばれています。通常HTTPリクエストに対する共通処理を記述することが多いです。

今回やりたいこと

ミドルウェアを利用してトレースログ機能を実装します。アプリケーションの処理開始前と終了後にそれぞれデバッグログを出力することで実現します。

実装手順

ミドルウェアの作成

artisanコマンドでミドルウェアの雛形クラスを作成します。app/Http/Middleware/TraceLog.phpが作成されます。

$ php artisan make:middleware TraceLog

# 成功時のメッセージ
Middleware created successfully.

作成された雛形にはhandleメソッドが作成されています。このhandleメソッドの中にログ出力処理を書いていきます。雛形の中で呼ばれている$nextメソッドはミドルウェアを通過して次の処理を呼ぶメソッドです。ミドルウェアが何層にもなっている場合は、次のミドルウェアを呼びます。ミドルウェアがひとつの場合は、後続のアプリケーション処理が呼ばれます。

開始ログはreturn $next($request);の前に記述します。そうすることでアプリケーション処理前にログ出力が実行されます。

    public function handle(Request $request, Closure $next)
    {
		    // リクエスト開始時のログ
		    \Log::debug('start ' . $request->url());

        return $next($request);
    }

次に終了後のログを出力します。ここで最初の雛形を一部変更しなければなりません。return $next($request)の部分です。このままの状態だとnextメソッドで呼ばれた後続の処理が終了するとreturnしてしまうので、後続の処理完了後の処理を書くことができません。そこで$nextの結果を一度変数に退避し、完了後の処理を書くことができるようにします。ログ出力処理完成後のhandleメソッドは以下です。


    public function handle(Request $request, Closure $next)
    {
		    // リクエスト開始時のログ
		    \Log::debug('start ' . $request->url());

        $response = $next($request);

		    // リクエスト終了時のログ
		    \Log::debug('end ' . $request->url());

		    return $response;
    }

ミドルウェアの呼び出し

作成したミドルウェアをルーティングで呼び出してみます。Route::middlewareで先程作成したTraceLogを呼び出します。さらにgroupメソッドをチェーンさせます。このgroupメソッド内に記述されたルーティングにミドルウェアが適用されます。サンプルのURLとして/sampleを定義してみました。

use App\Http\Middleware\TraceLog;

Route::middleware([TraceLog::class])->group(function(){
    Route::get('/sample', function(){
		    \Log::debug('hello world');
	  });
});

/sampleを呼び出した結果です。TraceLogで定義したstartとendのログが処理の前後に出力されています。以降URLが追加された場合でも、TraceLogが適用されたグループ内にルーティングを定義すれば同様のログを出力することができます。

[2021-07-25 00:12:01] local.DEBUG: start http://localhost:8000/api/sample  
[2021-07-25 00:12:01] local.DEBUG: hello world  
[2021-07-25 00:12:01] local.DEBUG: end http://localhost:8000/api/sample 

まとめ

今回はミドルウェアでトレースログを実装してみました。ミドルウェアはリクエストに対する共通処理を記述するにはとても便利な機能ですので是非使ってみてください。

Laravel

Posted by kobainmac