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


Posted in PHP onJuly 21, 2020

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

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

'log' => [
 'traceLevel' => YII_DEBUG ? 3 : 0,
 'targets' => [
  [
   'class' => 'yii\log\FileTarget',
   'levels' => ['error', 'warning'],
  ],
  'test' => [
   'class' => 'yii\log\DbTarget',//DaTarget类
   'logTable' => '{{%test_log}}',//日志表
   'levels' => ['error', 'info', 'warning'],//日志等级
  ],
 ],
],

二:生成日志表

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

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

三:使用日志

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

Yii::info()

四:自定义DbTarget日志

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

(1)在项目目录下执行

php yii migrate/create create_test_log

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

<?php
use yii\db\Migration;
/**
 * Class m200720_091126_create_test_log
 */
class m200720_091126_create_test_log extends Migration
{
 /**
  * {@inheritdoc}
  */
 public function safeUp()
 {
  $this->createTable('{{%test_log}}', [
   'id' => $this->bigPrimaryKey(),
   'level' => $this->integer()->notNull()->comment('日志等级'),
   'category' => $this->string(100)->notNull()->comment('分类名称'),
   'prefix' => $this->text(),
   'route' => $this->string(100)->notNull()->comment('路由'),
   'method' => $this->string(20)->notNull()->comment('请求方式'),
   'app' => $this->string(20)->comment('请求应用'),
   'module' => $this->string(20)->comment('请求模块'),
   'request' => $this->text()->comment('请求参数'),
   'status' => $this->string(10)->notNull()->comment('状态码'),
   'message' => $this->text()->comment('日志内容'),
   'request_at' => $this->double()->notNull()->comment('请求时间'),
   'ip' => $this->string(63)->comment('请求IP'),
  ], 'CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE=InnoDB COMMENT=\'请求日志表\'');
  //增加索引
  $this->createIndex('idx_log_level', '{{%test_log}}', 'level');
  $this->createIndex('idx_log_category', '{{%test_log}}', 'category');
  $this->createIndex('idx_log_route', '{{%test_log}}', 'route');
  $this->createIndex('idx_log_method', '{{%test_log}}', 'method');
  $this->createIndex('idx_log_status', '{{%test_log}}', 'status');
 }
 /**
  * @inheritdoc
  */
 public function safeDown()
 {
  $this->dropTable('{{%test_log}}');
 }
}

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

php yii migrate

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

<?php
namespace app\components;
use Yii;
use yii\helpers\VarDumper;
use yii\log\LogRuntimeException;
use yii\web\HttpException;
use yii\web\Request;
/**
 * DbTarget stores log messages in a database table.
 *
 * @see yii\log\DbTarget
 *
 * @author wangjian
 * @since 1.0
 */
class DbTarget extends \yii\log\DbTarget
{
 /**
  * @inheritdoc
  */
 public $categories = [
  'application',
  'yii\web\HttpException:*',
 ];
 /**
  * @inheritdoc
  */
 public $except = [
  // 'yii\web\HttpException:404',
 ];
 /**
  * @inheritdoc
  */
 public $logVars = ['_GET', '_POST'];
 /**
  * @var string 用户组件ID
  */
 public $userComponentId = 'user';
 /**
  * @inheritdoc
  */
 public function collect($messages, $final)
 {
  $this->messages = array_merge($this->messages, static::filterMessages($messages, $this->getLevels(), $this->categories, $this->except));
  $count = count($this->messages);
  if ($count > 0 && ($final || $this->exportInterval > 0 && $count >= $this->exportInterval)) {
   $oldExportInterval = $this->exportInterval;
   $this->exportInterval = 0;
   $this->export();
   $this->exportInterval = $oldExportInterval;
   $this->messages = [];
  }
 }
 /**
  * @inheritdoc
  */
 public function getMessagePrefix($message)
 {
  if ($this->prefix !== null) {
   return call_user_func($this->prefix, $message);
  }
  if (Yii::$app === null) {
   return '';
  }
  $ip = $this->getIp();
  $ip = empty($ip) ? '-' : $ip;
  return "[$ip]";
 }
 /**
  * @inheritdoc
  */
 public function export()
 {
  if ($this->db->getTransaction()) {
   $this->db = clone $this->db;
  }
  $tableName = $this->db->quoteTableName($this->logTable);
  $sql = "INSERT INTO $tableName ([[level]], [[category]], [[prefix]], [[route]], [[method]], [[app]], [[module]], [[request]], [[status]], [[message]], [[request_at]], [[ip]])
    VALUES (:level, :category, :prefix, :route, :method, :app, :module, :request, :status, :message, :request_at, :ip)";
  $command = $this->db->createCommand($sql);
  $request = Yii::$app->getRequest();
  list($route, $params) = $request->resolve();
  $method = $request->getMethod();
  $module = Yii::$app->controller->module->id;
  $route = str_replace("{$module}/", '', $route);
  foreach ($this->messages as $message) {
   list($text, $level, $category, $timestamp) = $message;
   $statusCode = 200;
   if (!is_string($text)) {
    if ($text instanceof \Throwable || $text instanceof \Exception) {
     $statusCode = $text instanceof HttpException ? $text->statusCode : 500;
     $text = $text->getMessage();
    } else {
     $text = VarDumper::export($text);
    }
   }
   if ($command->bindValues([
     ':level' => $level,
     ':category' => $category,
     ':prefix' => $this->getMessagePrefix($message),
     ':route' => $route,
     ':method' => $method,
     ':app' => Yii::$app->id,
     ':module' => $module,
     ':request' => $this->getContextMessage(),
     ':status' => $statusCode,
     ':message' => $text,
     ':request_at' => $timestamp,
     ':ip' => $this->getIp(),
    ])->execute() > 0) {
    continue;
   }
   throw new LogRuntimeException('Unable to export log through database!');
  }
 }
 /**
  * 获取当前IP
  */
 protected function getIp()
 {
  $request = Yii::$app->getRequest();
  return $request instanceof Request ? $request->getUserIP() : '';
 }
}

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

'log' => [
 'traceLevel' => YII_DEBUG ? 3 : 0,
 'targets' => [
  [
   'class' => 'yii\log\FileTarget',
   'levels' => ['error', 'warning'],
  ],
  'test' => [
   'class' => 'app\components\DbTarget',
   'logTable' => '{{%test_log}}',
   'levels' => ['error', 'info', 'warning'],
  ],
 ],
],

4:使用DbTarget日志

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

到此这篇关于Yii使用DbTarget实现日志功能的示例代码的文章就介绍到这了,更多相关Yii DbTarget 日志内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PHP 相关文章推荐
PHP操作文件方法问答
Mar 16 PHP
PHP的分页功能
Mar 21 PHP
php下MYSQL limit的优化
Jan 10 PHP
PHP+JS+rsa数据加密传输实现代码
Mar 23 PHP
zend framework配置操作数据库实例分析
Dec 06 PHP
浅析PHP substr,mb_substr以及mb_strcut的区别和用法
Jun 21 PHP
php字符串截取的简单方法
Jul 04 PHP
PHP定时更新程序设计思路分享
Jun 10 PHP
PHP使用mkdir创建多级目录的方法
Dec 22 PHP
PHP中strpos、strstr和stripos、stristr函数分析
Jun 11 PHP
Yii视图CGridView列表用法实例分析
Jul 12 PHP
详解PHP中curl_multi并发的实现
Jun 08 PHP
浅谈PHP之ThinkPHP框架使用详解
Jul 21 #PHP
浅谈php常用的7大框架的优缺点
Jul 20 #PHP
KindEditor在php环境下上传图片功能集成的方法示例
Jul 20 #PHP
php连接mysql之mysql_connect()与mysqli_connect()的区别
Jul 19 #PHP
PHP+MySql实现一个简单的留言板
Jul 19 #PHP
PHP8.0新功能之Match表达式的使用
Jul 19 #PHP
PHP程序守护进程化实现方法详解
Jul 16 #PHP
You might like
window+nginx+php环境配置 附配置搭配说明
2010/12/29 PHP
7个超级实用的PHP代码片段
2011/07/11 PHP
php实现检查文章是否被百度收录
2015/01/27 PHP
jQuery(1.6.3) 中css方法对浮动的实现缺陷分析
2011/09/09 Javascript
jquery判断浏览器类型的代码
2012/11/05 Javascript
通过javascript把图片转化为字符画
2013/10/24 Javascript
jquery判断元素是否隐藏的多种方法
2014/05/06 Javascript
jQuery禁用键盘后退屏蔽F5刷新及禁用右键单击
2016/01/22 Javascript
CentOS 安装NodeJS V8.0.0的方法
2017/06/15 NodeJs
js实现日期显示的一些操作(实例讲解)
2017/07/27 Javascript
Webpack实战加载SVG的方法
2017/12/26 Javascript
Node中使用ES6语法的基础教程
2018/01/05 Javascript
微信小程序实现简易table表格
2020/06/19 Javascript
python实现可以断点续传和并发的ftp程序
2016/09/13 Python
解决Matplotlib图表不能在Pycharm中显示的问题
2018/05/24 Python
浅谈python中对于json写入txt文件的编码问题
2018/06/07 Python
Python 通过打码平台实现验证码的实现
2019/05/13 Python
基于pytorch的保存和加载模型参数的方法
2019/08/17 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
2020/08/07 Python
中国医药集团国药在线:国药网
2017/02/06 全球购物
新东方旗下远程教育网站:新东方在线
2020/03/19 全球购物
几个Shell Script面试题
2014/04/18 面试题
如果让你测试一台高速激光打印机,你都会进行哪些测试
2012/12/04 面试题
英语专业个人求职信范文
2014/02/01 职场文书
采购部部长岗位职责
2014/02/06 职场文书
应聘医药销售自荐书范文
2014/02/08 职场文书
《沙漠中的绿洲》教学反思
2014/04/24 职场文书
初中学校军训方案
2014/05/09 职场文书
师范生见习报告
2014/10/31 职场文书
党员先进事迹材料
2014/12/19 职场文书
开平碉楼导游词
2015/02/06 职场文书
三行辞职书范文
2015/02/26 职场文书
大学运动会加油稿
2015/07/22 职场文书
学生会任命书范本
2015/09/21 职场文书
如何开发一个渐进式Web应用程序PWA
2021/05/10 Javascript
react 路由Link配置详解
2021/11/11 Javascript