一:在配置文件的log组件中配置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文件下编写创建数据库的迁移脚本

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类

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中target用法,Yii使用DbTarget实现日志功能的示例代码相关推荐

  1. php ajax mysql 分页查询_PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)

    1.首先做主页面Ajax_pag.php 代码如下: Ajax做分页 .header{ margin-top: 20px; } 关键字: 地区代号地区名称父级代号 2.然后做分页查询JS页面Ajax_ ...

  2. java中fileter用法,Java 8 使用Lambda表达式的FileFilter示例

    java.io.FileFilter接口是一个功能接口,在java 8中由 在这个例子中,我们将展示如何使用lambda表达式在FileFilter中来列出子目录的名称. 文件:LambdaFileF ...

  3. Asp.Net Core中利用Seq组件展示结构化日志功能

    在一次.Net Core小项目的开发中,掌握的不够深入,对日志记录并没有好好利用,以至于一出现异常问题,都得跑动服务器上查看,那时一度怀疑自己肯定没学好,不然这一块日志不可能需要自己扒服务器日志来查看 ...

  4. python代码大全和用法用量_Python生成器的使用方法和示例代码

    本文是<Effect Python 编写高质量Python代码的59个有效方法>的学习笔记.主要记录生成器的使用方法和示例代码. 返回队列的函数 如果函数要产生一系列结果,那么最简单的做法 ...

  5. ajax返回显示下拉列表,ajax中网页传输(二)JSON——下拉列表显示练习(示例代码)...

    以json返回数据类型显示"民族下拉列表" 第一:body页面显示部分 JSON下拉显示Nation表中的数据 用下拉显示Nation表中的数据 第二:jscrip中ajax后台函 ...

  6. java中map集合的修改_map集合修改其中元素(示例代码)

    packagecom.swift.lianxi;importjava.util.HashMap;importjava.util.Iterator;importjava.util.Map;importj ...

  7. linux out 日志,关于Linux中nohup.out日志过大问题(示例代码)

    关于Linux中nohup.out日志过大问题 背景,java项目,一般在运行JAVA程序时需要用到nohup命令来实现后台启动日志,默认保存在当前目露nohup.out文件.但是有些程序输出nohu ...

  8. java中的年轻态,14、Java垃圾回收机制(示例代码)

    垃圾回收原理和算法 ??Java引入了垃圾回收机制,令C++程序员最头疼的内存管理问题迎刃而解.Java程序员可以将更多的精力放到业务逻辑上面,而不是内存管量上面,大大的提高了开发效率.这是因为Jav ...

  9. c语言中文件相对路径,C++相对路径和绝对路径(示例代码)

    学习备忘 转自:http://www.cnblogs.com/vranger/p/3820783.html 电脑硬盘E盘下,建文件夹"test","test"下 ...

最新文章

  1. 机器学习典型步骤以及训练集、验证集和测试集概念
  2. jdk与jre的区别(转)
  3. 每天一点点之vue框架开发 - axios解决跨越问题
  4. 【转载】关于幂律分布的一个笔记
  5. 面试官问我有环链表中怎么找到入口,本以为很简单当场却想傻了
  6. ​AAAI 2022 | 基于强化学习的视频弹幕攻击
  7. Mysql迁移到Oracle方法
  8. 从TCP到RDMA网络最新技术|扩展技术视野
  9. 解决夜神模拟器无法联机调试 adb server version (**) doesn't match this client (**); killing...
  10. Leetcode--1004. 最大连续1的个数Ⅲ
  11. 2019年7月第一周总结-RabbitMQ总结
  12. python解决urllib发送请求报错:urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED].....>
  13. IntelliJ IDEA 打包Maven 构建的 Java 项目
  14. ps2018 html面板,28组经典PS 2018插件合集
  15. RHEL6 开启远程桌面
  16. 微信小程序 + 腾讯位置服务获取全国城市列表
  17. 自定义AutoTextView实现公告栏 文字3D 翻转动画
  18. macmini作为远程服务器,我在用我的 Mac mini 做什么
  19. 用于图像分割的卷积神经网络:从R-CNN到Mask R-CNN
  20. 一个功能超全的「登录认证」神器!

热门文章

  1. Linux监控命令之==netstat
  2. 使用wireshark分析tcp/ip报文之报文头
  3. 关于MySQL的SLEEP(N)函数
  4. newman的键盘不错
  5. perl里字符串取长度,比较等一些操作
  6. 用VS.NET 2005重构你的代码
  7. 如何将APACHE许可证应用于您的工作
  8. python项目ImportError: Plotly express requires pandas to be installed.解决方案
  9. 算法提高课-数学知识-矩阵乘法-AcWing 1303. 斐波那契前 n 项和:矩阵乘法,快速幂,线性代数
  10. Leetcode5633. 计算力扣银行的钱[C++题解]:模拟简单