tritue.edu.vn


Tạo log hệ thống

Bài viết này sẽ hướng dẫn các bạn tạo log hệ thống trong Yii1



Bước 1: Tạo bảng lưu log

Copy
         

CREATE TABLE `audit_log` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `user_id` INT NULL,
  `ip_address` VARCHAR(45) NULL,
  `model` VARCHAR(100) NOT NULL,
  `record_id` INT NOT NULL,
  `action` ENUM('INSERT','UPDATE','DELETE') NOT NULL,
  `changed_fields` JSON NULL,
  `before` JSON NULL,
  `after` JSON NULL,
  `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_model` (`model`),
  KEY `idx_record_id` (`record_id`),
  KEY `idx_action` (`action`),
  KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 


Bạn có thể dùng bảng này cho mọi phiên bản MySQL

Copy
         

CREATE TABLE `audit_log` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `user_id` INT NULL,
  `ip_address` VARCHAR(45) NULL,
  `model` VARCHAR(100) NOT NULL,
  `record_id` INT NOT NULL,
  `action` VARCHAR(20) NOT NULL,
  `changed_fields` TEXT NULL,
  `before` TEXT NULL,
  `after` TEXT NULL,
  `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 


Bước 2: Tạo file: components/LogBehavior.php

Copy
         

class LogBehavior extends CActiveRecordBehavior
{
    public function afterSave($event)
    {
        $action = $this->owner->isNewRecord ? 'INSERT' : 'UPDATE';
        Yii::app()->db->createCommand()->insert('system_logs', [
            'user_id' => Yii::app()->user->id,
            'action' => $action,
            'table_name' => get_class($this->owner),
            'data' => json_encode($this->owner->attributes),
            'created_at' => new CDbExpression('NOW()'),
        ]);
    }

    public function afterDelete($event)
    {
        Yii::app()->db->createCommand()->insert('system_logs', [
            'user_id' => Yii::app()->user->id,
            'action' => 'DELETE',
            'table_name' => get_class($this->owner),
            'data' => json_encode($this->owner->attributes),
            'created_at' => new CDbExpression('NOW()'),
        ]);
    }
}
 


Bước 3: Gán trong từng model hoặc toàn hệ thống

Copy
         

- Gán trong mỗi model:

public function behaviors()
{
    return [
        'LogBehavior' => [
            'class' => 'application.components.LogBehavior',
        ],
    ];
}
- Hoặc gán toàn hệ thống trong config/main:

'components'=>[
    ...
],
'behaviors'=>[
    'LogBehavior' => [
        'class'=>'application.components.LogBehavior',
    ],
]
 

 




Link chia sẻ bài viết
Copy
            https://tritue.edu.vn/tuecode/tracnghiem30/site/data/YVdRc01qUTBMRjl5YjNWMFpTeGlZV2wyYVdWMEwzQnZjM1F2ZG1sbGR3PT0%3D