[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件/月まで利用できます。
create new project
で任意のプロジェクトを作成しましょう。
作成が完了するとプロジェクトへのアクセストークンが発行されます。
Laravel側で利用するのはserver-side access token
なので、この情報を.env
ファイルへ追記します。
LOG_ROLLBAR_TOKEN=your post_server_item token
config/logging.php
へRollbar
の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
へアクセスしてログを確認してみましょう。
People
でユーザー毎のログを確認できます。
Rollbar
ではユーザーのリクエスト値やサーバー情報、SESSION情報、利用ブラウザ等の様々なデータが格納でき、柔軟な検索が可能です。
とても便利なサービスですので、この機会に是非使ってみましょう。