AS400/IBMi Laravelでユーザーの使用ログを取る

IT関連

ユーザーにデータベースの内容を照会するシステムを作ってきたけど、ログを取らないと、誰がどんなメニューを使ったのか、このメニューは誰か使ってくれているのかが解らないので、ログを取るようにしたい。

手順は、

  1. ログ用のテーブルを作る
  2. ログ用テーブルのモデルを作る
  3. モデルの中に記録を書き込むファンクションを作る
  4. コントローラーからモデルを呼び出す

こんな感じだけど、いちいち全てのコントローラーに仕込むのは面倒なので、ミドルウェアに登録して全てで呼び出すようにする。

 

ログ用テーブル

本当は他にもあるけど最低限こんな感じ。

日付と時刻と使用者名とパスです。

スキーマはHOGELIBで、テーブルはLOGTABLEにする。

 

ログテーブル用のモデルとファンクション

<?php

namespace App;
use Illuminate\Database\Eloquent\Model;

class LOGTABLE extends Model
{
    //ドライバー指定
    protected $connection = 'odbc';
    //テーブル指定
    protected $table = 'HOGELIB.LOGTABLE';
    
    //データ更新時対応(updated_at対策)
    public $incrementing = false;
    public $timestamps = false;


    public static function rec($path) {

      //エラーしても落ちないようにハンドリングする
      try{

        // サーバ環境によらずタイムゾーン設定をする
        date_default_timezone_set('Asia/Tokyo');

        $LOGTABLE = new LOGTABLE;
        $LOGTABLE->USER = '使用者';
        $LOGTABLE->PATH = $path;
        $LOGTABLE->DATE = date('Ymd');
        $LOGTABLE->TIME = date('His');
        $LOGTABLE->save();

      }catch(\Exception $e){
        //処理なし
      }

    }

}

‘使用者’は自分のプログラム内で引っ張るようにすること。

 

ミドルウェアを作成

作り方はコマンドを叩く。

自分のXAMPPテスト環境に作るので、コマンドプロンプトを開き、cdでhtdocsフォルダまで移動する。

コマンドは下記。ミドルウェアの名前はRecにした。RecMiddleware。

> php artisan make:middleware RecMiddleware

これでRecMiddlewareが、Http直下Controllersと同じ階層にあるMiddlewareの中に出来る。

 

ミドルウェアを修正

下記のように修正してミドルウェアからモデルとファンクションにアクセスするようにする。

<?php

namespace App\Http\Middleware;
use App\LOGTABLE;
use Closure;

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

        //リクエストから現在のパスを取得する
        $path = $request->path();
        
        //パスを渡して書き込む 
        LOGTABLE::rec($path);

        return $next($request);
    }
}

 

ミドルウェアを毎回呼び出すようにする

Http直下にあるKernel.phpを開き$middlewareに追記する。カンマを忘れないように注意。

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array
     */
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \App\Http\Middleware\TrustProxies::class,
        //下記を追記した
        \App\Http\Middleware\RecMiddleware::class,
    ];

 

これでいけるはず。どこのメニューに誰がアクセスしても記録されているはず。

後は本番にpushするだけ。

コメント

タイトルとURLをコピーしました