shibomb eats weird things...

and out something.

Laravelでリクエストとレスポンスのかんたんアクセスログ

f:id:shibomb:20181029212930p:plain
Vue.jsをフロントエンドに使ったシステム開発にて、LaravelをREST APIサーバとして使っています。

ブラウザからのアクセスではないのでエラー発生時などに画面でエラーが確認できるわけではないので、デバッグが捗りませんね。
そこで、フロントエンド側やRestlet Clientなどのテスト用クライアントから、ちゃんとアクセス出来ているかを簡単に確認するために、簡易ログを記録したいと思います。

Middlewareを使って実現します。

laravel.com

ミドルウェアを定義

php artisan make:middleware RequestResponseLogMiddleware

→ app/Http/Middleware/RequestResponseLogMiddleware.php が生成されます。
(直接作っても良いですが、一応、お作法に従います。)

RequestResponseLogMiddlewareを編集

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\App;

class RequestResponseLogMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $uniqid = uniqid();

        if (App::environment('local')) {
            $this->logRequest($uniqid, $request);
        }

        $response = $next($request);

        if (App::environment('local')) {
            $this->logResponse($uniqid, $response);
        }

        return $response;
    }

    /**
     * Log request
     *
     * @param string $uniqid
     * @param \Illuminate\Http\Request $request https://laravel.com/api/5.7/Illuminate/Http/Request.html
     */
    private function logRequest($uniqid, $request)                                                                                                 
    {
        \Log::debug($uniqid, [
            // "header" => $request->header(),
            "method" => $request->method(), 
            "path" => $request->fullUrl(),
            "input" => $request->all(),
        ]);
    }

    /**
     * Log response
     * 
     * @param string $uniqid
     * @param \Illuminate\Http\Response $response https://laravel.com/api/5.7/Illuminate/Http/Response.html
     */
    private function logResponse($uniqid, $response)                                                                                                 
    {
        \Log::debug($uniqid, [
            // "header" => $response->headers, 
            "status" => $response->status(), 
            "exception" => $response->exception,
            //"content" => $response->content(),
        ]);
    }
}

リクエストの Authorizationヘッダ, レスポンスの Content-Typeヘッダ、コンテンツ内容も出力したい場合は、それぞれのコメントを解除してください。

ミドルウェアを登録

グローバルミドルウェアとして適用する場合

システム共通で常にこのミドルウェアを使用する場合は Karnel.php に登録します。

:
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array
     */
    protected $middleware = [
        :
        \App\Http\Middleware\RequestResponseLogMiddleware::class,
        :
    ];
:

Routeの種類や、Route毎に適用する場合

下記をご参考ください。

  • Routeの種類: Middleware Groups
  • Route毎: Assigning Middleware To Routes

laravel.com

ログを監視

ログは通常、下記に出力されます。

storage/logs/laravel.log

設定は logging.php を参照

監視はlinuxのtailコマンドを使うなどしましょう。

tail -f storage/logs/laravel.log # 初期設定のまま
tail -f storage/logs/laravel-2018-10-28.log # Dailyログにしている場合はファイル名にご注意
© shibomb. All Rights Reserved.