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 相关文章推荐
example2.php
Oct 09 PHP
PHP调用三种数据库的方法(2)
Oct 09 PHP
php面向对象全攻略 (四)构造方法与析构方法
Sep 30 PHP
PHP字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br
Nov 10 PHP
PHP调用JAVA的WebService简单实例
Mar 11 PHP
PHP的一个完美GIF等比缩放类,附带去除缩放黑背景
Apr 01 PHP
php判断两个日期之间相差多少个月份的方法
Jun 18 PHP
大家在抢红包,程序员在研究红包算法
Aug 31 PHP
在WordPress中实现评论头像的自定义默认和延迟加载
Nov 24 PHP
PHP读取zip文件的方法示例
Nov 17 PHP
php创建类并调用的实例方法
Sep 25 PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
Dec 29 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
PHP中的MYSQL常用函数(php下操作数据库必备)
2010/09/12 PHP
jQuery阻止冒泡和HTML默认操作
2010/11/17 Javascript
js实现文本框宽度自适应文本宽度的方法
2015/08/13 Javascript
javascript执行环境及作用域详解
2016/05/05 Javascript
Vue.js与 ASP.NET Core 服务端渲染功能整合
2017/11/16 Javascript
微信小程序实现点击按钮修改文字大小功能【附demo源码下载】
2017/12/06 Javascript
jQuery实现下拉菜单动态添加数据点击滑出收起其他功能
2018/06/14 jQuery
jQuery-ui插件sortable实现自由拖动排序
2018/12/01 jQuery
python虚拟环境 virtualenv的简单使用
2020/01/21 Javascript
基于redis的小程序登录实现方法流程分析
2020/05/25 Javascript
js实现QQ邮箱邮件拖拽删除功能
2020/08/27 Javascript
Python实现获取某天是某个月中的第几周
2015/02/11 Python
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
python实现手机通讯录搜索功能
2018/02/22 Python
钉钉群自定义机器人消息Python封装的实例
2019/02/20 Python
python自定义线程池控制线程数量的示例
2019/02/22 Python
Python画图实现同一结点多个柱状图的示例
2019/07/07 Python
Python函数装饰器原理与用法详解
2019/08/16 Python
python使用 request 发送表单数据操作示例
2019/09/25 Python
python银行系统实现源码
2019/10/25 Python
巴黎卡诗美国官方网站:始于1964年的头发头皮护理专家
2017/07/10 全球购物
全球摩托车装备领导者:RevZilla
2017/09/04 全球购物
意大利独特而优质的家居用品:Fazzini
2018/12/05 全球购物
New Balance比利时官方网站:购买鞋子和服装
2021/01/15 全球购物
请写出char *p与"零值"比较的if语句
2014/09/24 面试题
介绍一下Java的事务处理
2012/12/07 面试题
CSS代码检查工具stylelint的使用方法详解
2021/03/27 HTML / CSS
国庆节演讲稿
2014/05/27 职场文书
品牌推广策划方案
2014/05/28 职场文书
领导班子对照检查材料
2014/09/22 职场文书
客户经理岗位职责
2015/01/31 职场文书
男方婚前保证书
2015/02/28 职场文书
中学生清明节演讲稿
2015/03/18 职场文书
活动总结模板大全
2015/05/11 职场文书
家长会感言
2015/08/01 职场文书
《鸟的天堂》教学反思
2016/02/19 职场文书