一:在配置文件的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文件下编写创建数据库的迁移脚本
<?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 日志内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!
本文向大家介绍Yii实现文章列表置顶功能示例,包括了Yii实现文章列表置顶功能示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Yii实现文章列表置顶功能的方法。分享给大家供大家参考,具体如下: 我的理解:首先点击获取当前ID,model层查询所有sort字段,遍历数据,得到最大值,修改数据,替换数据,即可。 效果图: 模型层: 控制器: 视图层: 更多关于Yii相关内容感兴趣的读者可查
本文向大家介绍Python常用模块logging——日志输出功能(示例代码),包括了Python常用模块logging——日志输出功能(示例代码)的使用技巧和注意事项,需要的朋友参考一下 用途 logging模块是Python的内置模块,主要用于输出运行日志,可以灵活配置输出日志的各项信息。 基本使用方法 参数 日志一共分成5个等级,从低到高分别是:DEBUG ,INFO ,WARNING ,ER
本文向大家介绍使用vue实现grid-layout功能实例代码,包括了使用vue实现grid-layout功能实例代码的使用技巧和注意事项,需要的朋友参考一下 1.先clone项目到本地。 2.git reset --hard commit 命令可以使当前head指向某个commit。 完成html的基本布局 点击复制按钮来复制整个commit id。然后在项目根路径下运行 git reset 。
本文向大家介绍Spring AOP实现功能权限校验功能的示例代码,包括了Spring AOP实现功能权限校验功能的示例代码的使用技巧和注意事项,需要的朋友参考一下 实现功能权限校验的功能有多种方法,其一使用拦截器拦截请求,其二是使用AOP抛异常。 首先用拦截器实现未登录时跳转到登录界面的功能。注意这里没有使用AOP切入,而是用拦截器拦截,因为AOP一般切入的是service层方法,而拦截器是拦截控
本文向大家介绍Android PC投屏功能实现的示例代码,包括了Android PC投屏功能实现的示例代码的使用技巧和注意事项,需要的朋友参考一下 本文介绍了Android PC投屏功能实现的示例代码,分享给大家,具体如下: 代码地址 :https://github.com/deepsadness/MediaProjectionDemo 效果预览 投屏效果预览 简单说明: 使用Android Me
本文向大家介绍Yii框架使用魔术方法实现跨文件调用功能示例,包括了Yii框架使用魔术方法实现跨文件调用功能示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Yii框架使用魔术方法实现跨文件调用。分享给大家供大家参考,具体如下: 目前项目用yii框架,controller调用facade的方法,facade调用adapter的方法,adapter调用api的方法,api封装了sql方法,但