当前位置:首页 > CMS教程 > 其它CMS > 列表

Yii使用DbTarget实现日志功能的示例代码

发布:smiling 来源: PHP粉丝网  添加日期:2022-03-19 14:35:26 浏览: 评论:0 

这篇文章主要介绍了Yii使用DbTarget实现日志功能的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

一:在配置文件的log组件中配置DbTarget

Yii使用DbTarget实现日志功能的示例代码

  1. 'log' => [ 
  2.  'traceLevel' => YII_DEBUG ? 3 : 0, 
  3.  'targets' => [ 
  4.   [ 
  5.    'class' => 'yii\log\FileTarget'
  6.    'levels' => ['error''warning'], 
  7.   ], 
  8.   'test' => [ 
  9.    'class' => 'yii\log\DbTarget',//DaTarget类 
  10.    'logTable' => '{{%test_log}}',//日志表 
  11.    'levels' => ['error''info''warning'],//日志等级 
  12.   ], 
  13.  ], 
  14. ], 

二:生成日志表

在项目目录下执行如下命令生成日志表

php yii migrate --migrationPath=@yii/log/migrations/

三:使用日志

在需要使用日志的地方使用

Yii::info()

四:自定义DbTarget日志

1:首先创建一个自定义的日志表

(1)在项目目录下执行

php yii migrate/create create_test_log

(2):在创建的migrate文件下编写创建数据库的迁移脚本

  1. <?php 
  2. use yii\db\Migration; 
  3. /** 
  4.  * Class m200720_091126_create_test_log 
  5.  */ 
  6. class m200720_091126_create_test_log extends Migration 
  7.  /** 
  8.   * {@inheritdoc} 
  9.   */ 
  10.  public function safeUp() 
  11.  { 
  12.   $this->createTable('{{%test_log}}', [ 
  13.    'id' => $this->bigPrimaryKey(), 
  14.    'level' => $this->integer()->notNull()->comment('日志等级'), 
  15.    'category' => $this->string(100)->notNull()->comment('分类名称'), 
  16.    'prefix' => $this->text(), 
  17.    'route' => $this->string(100)->notNull()->comment('路由'), 
  18.    'method' => $this->string(20)->notNull()->comment('请求方式'), 
  19.    'app' => $this->string(20)->comment('请求应用'), 
  20.    'module' => $this->string(20)->comment('请求模块'), 
  21.    'request' => $this->text()->comment('请求参数'), 
  22.    'status' => $this->string(10)->notNull()->comment('状态码'), 
  23.    'message' => $this->text()->comment('日志内容'), 
  24.    'request_at' => $this->double()->notNull()->comment('请求时间'), 
  25.    'ip' => $this->string(63)->comment('请求IP'), 
  26.   ], 'CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE=InnoDB COMMENT=\'请求日志表\''); 
  27.   //增加索引 
  28.   $this->createIndex('idx_log_level''{{%test_log}}''level'); 
  29.   $this->createIndex('idx_log_category''{{%test_log}}''category'); 
  30.   $this->createIndex('idx_log_route''{{%test_log}}''route'); 
  31.   $this->createIndex('idx_log_method''{{%test_log}}''method'); 
  32.   $this->createIndex('idx_log_status''{{%test_log}}''status'); 
  33.  } 
  34.  /** 
  35.   * @inheritdoc 
  36.   */ 
  37.  public function safeDown() 
  38.  { 
  39.   $this->dropTable('{{%test_log}}'); 
  40.  } 

(3):执行如下命令生成DbTarget日志表

php yii migrate

2:编写一个DbTarget类来继承yiilogDbTarget类

  1. <?php 
  2. namespace app\components; 
  3. use Yii; 
  4. use yii\helpers\VarDumper; 
  5. use yii\log\LogRuntimeException; 
  6. use yii\web\HttpException; 
  7. use yii\web\Request; 
  8. /** 
  9.  * DbTarget stores log messages in a database table. 
  10.  * 
  11.  * @see yii\log\DbTarget 
  12.  * 
  13.  * @author wangjian 
  14.  * @since 1.0 
  15.  */ 
  16. class DbTarget extends \yii\log\DbTarget 
  17.  /** 
  18.   * @inheritdoc 
  19.   */ 
  20.  public $categories = [ 
  21.   'application'
  22.   'yii\web\HttpException:*'
  23.  ]; 
  24.  /** 
  25.   * @inheritdoc 
  26.   */ 
  27.  public $except = [ 
  28.   // 'yii\web\HttpException:404', 
  29.  ]; 
  30.  /** 
  31.   * @inheritdoc 
  32.   */ 
  33.  public $logVars = ['_GET''_POST']; 
  34.  /** 
  35.   * @var string 用户组件ID 
  36.   */ 
  37.  public $userComponentId = 'user'
  38.  /** 
  39.   * @inheritdoc 
  40.   */ 
  41.  public function collect($messages$final
  42.  { 
  43.   $this->messages = array_merge($this->messages, static::filterMessages($messages$this->getLevels(), $this->categories, $this->except)); 
  44.   $count = count($this->messages); 
  45.   if ($count > 0 && ($final || $this->exportInterval > 0 && $count >= $this->exportInterval)) { 
  46.    $oldExportInterval = $this->exportInterval; 
  47.    $this->exportInterval = 0; 
  48.    $this->export(); 
  49.    $this->exportInterval = $oldExportInterval
  50.    $this->messages = []; 
  51.   } 
  52.  } 
  53.  /** 
  54.   * @inheritdoc 
  55.   */ 
  56.  public function getMessagePrefix($message
  57.  { 
  58.   if ($this->prefix !== null) { 
  59.    return call_user_func($this->prefix, $message); 
  60.   } 
  61.   if (Yii::$app === null) { 
  62.    return ''
  63.   } 
  64.   $ip = $this->getIp(); 
  65.   $ip = emptyempty($ip) ? '-' : $ip
  66.   return "[$ip]"
  67.  } 
  68.  /** 
  69.   * @inheritdoc 
  70.   */ 
  71.  public function export() 
  72.  { 
  73.   if ($this->db->getTransaction()) { 
  74.    $this->db = clone $this->db; 
  75.   } 
  76.   $tableName = $this->db->quoteTableName($this->logTable); 
  77.   $sql = "INSERT INTO $tableName ([[level]], [[category]], [[prefix]], [[route]], [[method]], [[app]], [[module]], [[request]], [[status]], [[message]], [[request_at]], [[ip]]) 
  78.     VALUES (:level, :category, :prefix, :route, :method, :app, :module, :request, :status, :message, :request_at, :ip)"; 
  79.   $command = $this->db->createCommand($sql); 
  80.   $request = Yii::$app->getRequest(); 
  81.   list($route$params) = $request->resolve(); 
  82.   $method = $request->getMethod(); 
  83.   $module = Yii::$app->controller->module->id; 
  84.   $route = str_replace("{$module}/"''$route); 
  85.   foreach ($this->messages as $message) { 
  86.    list($text$level$category$timestamp) = $message
  87.    $statusCode = 200; 
  88.    if (!is_string($text)) { 
  89.     if ($text instanceof \Throwable || $text instanceof \Exception) { 
  90.      $statusCode = $text instanceof HttpException ? $text->statusCode : 500; 
  91.      $text = $text->getMessage(); 
  92.     } else { 
  93.      $text = VarDumper::export($text); 
  94.     } 
  95.    } 
  96.    if ($command->bindValues([ 
  97.      ':level' => $level
  98.      ':category' => $category
  99.      ':prefix' => $this->getMessagePrefix($message), 
  100.      ':route' => $route
  101.      ':method' => $method
  102.      ':app' => Yii::$app->id, 
  103.      ':module' => $module
  104.      ':request' => $this->getContextMessage(), 
  105.      ':status' => $statusCode
  106.      ':message' => $text
  107.      ':request_at' => $timestamp
  108.      ':ip' => $this->getIp(), 
  109.     ])->execute() > 0) { 
  110.     continue
  111.    } 
  112.    throw new LogRuntimeException('Unable to export log through database!'); 
  113.   } 
  114.  } 
  115.  /** 
  116.   * 获取当前IP 
  117.   */ 
  118.  protected function getIp() 
  119.  { 
  120.   $request = Yii::$app->getRequest(); 
  121.   return $request instanceof Request ? $request->getUserIP() : ''
  122.  } 

3:在配置文件中将yiilogDbTarget类改成我们自定义的类

  1. 'log' => [ 
  2.  'traceLevel' => YII_DEBUG ? 3 : 0, 
  3.  'targets' => [ 
  4.   [ 
  5.    'class' => 'yii\log\FileTarget'
  6.    'levels' => ['error''warning'], 
  7.   ], 
  8.   'test' => [ 
  9.    'class' => 'app\components\DbTarget'
  10.    'logTable' => '{{%test_log}}'
  11.    'levels' => ['error''info''warning'], 
  12.   ], 
  13.  ], 
  14. ], 

4:使用DbTarget日志

同样的使用Yii::info来记录日志

Tags: DbTarget Yii日志

分享到: