[Laravel] ユーザーのアクセスログを保存する

アプリケーションへアクセスしたユーザーのアクセスログは何かと役に立つので取っておきたいと思う人が多いと思います。

Laravelには認証系のイベントが用意されており、ログインしているユーザーからのリクエストがあった場合にIlluminate\Auth\Events\Authenticatedイベントが発火されます。このイベントを購読することで、アクセスログの取得が可能です。

保存先には色々考えられますが、オンラインのログサービスのRollbarへ保存する方法を紹介します。Rollbar本来の利用方法とは異なるかもしれませんが、とても利便性の高いログ情報を取得することができます。

データベース等、保存先を変更する場合でもリスナーを変更すれば同じような動作が可能です。

パッケージの導入

Composerでxzxzyzyz/laravel-logging-rollbarをインストールします。

パッケージの詳細についてはGitHub - xzxzyzyz/laravel-logging-rollbar: Rollbar for Laravel Loggingを参照してください。

$ composer require xzxzyzyz/laravel-logging-rollbar

Rollbarの準備

Rollbarのアカウントをお持ちでない場合は以下からサインアップしてください。無料プランも用意されており、5,000件/月まで利用できます。

Rollbar

create new projectで任意のプロジェクトを作成しましょう。

laravel-access-log-to-rollbar_01

作成が完了するとプロジェクトへのアクセストークンが発行されます。

laravel-access-log-to-rollbar_02

Laravel側で利用するのはserver-side access tokenなので、この情報を.envファイルへ追記します。

LOG_ROLLBAR_TOKEN=your post_server_item token

config/logging.phpRollbarのchannelを追加することで、Rollbarへの 通知をLaravelのログとして利用できるようになります。

// channelsへ追加

'channels' => [
    ...

    'rollbar' => [
        'driver' => 'custom',
        'access_token' => env('LOG_ROLLBAR_TOKEN'),
        'via' => Xzxzyzyz\Laravel\Logging\Rollbar\RollbarLogger::class
    ],
],

アクセスログを保存するリスナーの作成

以下の用なIlluminate\Auth\Events\Authenticatedイベントのリスナーを作成しましょう。

今回はログのラベルとしてアクセスのあったURLを利用します。

<?php

namespace App\Listeners;

use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Auth\Events\Authenticated;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\URL;

class AccessLogToRollbarListener
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  object  $event
     * @return void
     */
    public function handle(Authenticated $event)
    {
        Log::channel('rollbar')->info(URL::current());
    }
}

作成したリスナーをEventServiceProviderへ登録します。

// app/Providers/EventServiceProvider.php

/**
 * The event listener mappings for the application.
 *
 * @var array
 */
protected $listen = [
    'Illuminate\Auth\Events\Authenticated' => [
        'App\Listeners\AccessLogToRollbarListener',
    ],
];

以上でアクセスログをRollbarへ保存する準備ができました。

次に実際にログを送信してみます。

アクセスログの確認

migrationを実行してユーザー情報の入れ物を用意しておきます。

$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table

認証周りを有効にしておきます。

$ php artisan make:auth
Authentication scaffolding generated successfully.

/registerへアクセスしてユーザー登録を行うのと同じですが、tinkerを利用してユーザーを作成します。

$ php artisan tinker
Psy Shell v0.8.17 (PHP 7.1.10 — cli) by Justin Hileman
>>> factory(App\User::class)->create();
=> App\User {#790
     name: "Sally Stiedemann",
     email: "[email protected]",
     updated_at: "2018-03-23 02:21:32",
     created_at: "2018-03-23 02:21:32",
     id: 1,
   }
>>>

/loginへアクセスして作成したユーザーでログインした後、Rollbarへアクセスしてログを確認してみましょう。

laravel-access-log-to-rollbar_03

Peopleでユーザー毎のログを確認できます。

laravel-access-log-to-rollbar_04

Rollbarではユーザーのリクエスト値やサーバー情報、SESSION情報、利用ブラウザ等の様々なデータが格納でき、柔軟な検索が可能です。

とても便利なサービスですので、この機会に是非使ってみましょう。

© Xzxzyzyz