Speaktech.in

Log the URLs users visited in Yii 2

Yii 2 behavior to log the URLs user have visited on our Yii 2 powered application.

Lets get started.


1.Create a behavior folder in the commons/behaviors/ directory,then create LogactionBehavior.php.

<?php
namespace common\behaviors;

use Yii;
use yii\web\Controller;
use yii\base\Behavior;
use yii\web\Request;

class LogactionBehavior extends Behavior
{
    /**
     *
     * @var yii\web\Request
     */
    private $request;

    /**
     * Use dependency injection to inject yii\web\Request
     * @param array $config
     * @param yii\web\Request  $request
     */
    public function __construct($config =[],Request $request)
    {
        parent::__construct($config);
        $this->request = $request;
    }

    /**
     * Activation of events
     * Register beforeAction to  Controller::EVENT_BEFORE_ACTION
     * Register afterAction to Controller::EVENT_AFTER_ACTION
     * @return array
     */
    public function events()
    {
        return [
            Controller::EVENT_BEFORE_ACTION => 'beforeAction',
            Controller::EVENT_AFTER_ACTION => 'afterAction'
        ];
    }

    /**
     * log
     */
    public function beforeAction()
    {
          Yii::beginProfile('myBenchmark');//log user activty to,myBenchmark---change modify the name
        Yii::info( "=====================================================================" ,'preneesh');
        $date =date("Y/m/d h:i:sa");
        //$url = $this->request->url;
        $url = Yii::$app->getRequest()->url;
        $ip = Yii::$app->getRequest()->getUserIP();
        $params = Yii::$app->getRequest()->getRawBody();
        $newactivity = '     User: '.Yii::$app->user->identity->UsersID.' | ip: '.Yii::$app->request->userIp.' | method: '.Yii::$app->request->method.' | url: '.Yii::$app->request->url.' | referer: '.Yii::$app->request->referrer.' | useragent: '.Yii::$app->request->userAgent;
        Yii::info($newactivity,'preneesh');

        $log ="    preneesh".$date." | url:   ".$url." | ip: ".$ip."  |body start: ".$params." | body finish  ";
        Yii::info($log,'preneesh');
    }

    public function afterAction()
    {
        Yii::endProfile('myBenchmark');//end analysis
    }
}



2. Go to the controller which require to be logged and add below code.


//log request
use common\behaviors\LogactionBehavior;

  public function behaviors()
{
    return [
        LogactionBehavior::className(),
    ];
  }


3 Add to application configuration api/main.php

      'log' => [
           'traceLevel' => YII_DEBUG ? 3 : 0,
             'flushInterval'=> 1,
                 'targets' => [
       [
           'class' => 'yii\log\FileTarget',
           'levels' => ['error', 'warning'],
         'logFile' => '@runtime/logs/app.log',
             'exportInterval'=>1,

       ],
       [
           'class' => 'yii\log\FileTarget',
             'levels' => ['info','profile'],
           'logFile' => '@runtime/logs/info.log',
               'exportInterval'=>1,

       ],
       [
           'class' => 'yii\log\FileTarget',
           // 'levels' => ['info'],
           'logVars' => [],
           'categories' => ['preneesh'],
            'logFile' => '@runtime/logs/custom.log',
           'exportInterval'=>1,

       ],
       ],
     ],