Yii2:是不是可以从登录 Yii 调试器中过滤掉一些查询?

Posted

技术标签:

【中文标题】Yii2:是不是可以从登录 Yii 调试器中过滤掉一些查询?【英文标题】:Yii2: is it possible to filter out some query from being logged into Yii Debugger?Yii2:是否可以从登录 Yii 调试器中过滤掉一些查询? 【发布时间】:2015-09-16 08:05:16 【问题描述】:

我喜欢 Yii2 日志系统,但我想“缩小”一点日志以避免像

那样记录查询
SHOW CREATE TABLE `tbl_product`

或与 RBAC 相关的类似

SELECT * FROM `tbl_auth_assignment` WHERE `user_id`='1'

我可以在哪里以及如何自定义/配置日志记录系统以排除查询按 sql 文本(不是通常按日志类别/级别)?

我知道我可以扩展 FileTarget 以避免某些消息被写入磁盘。例如:

<?php

namespace common\components;

class CustomFileTarget extends \yii\log\FileTarget
   
    // this is an override
    public function collect($messages, $final)
    

        foreach ($messages as $index  => $message) 
            // See http://www.yiiframework.com/doc-2.0/yii-log-logger.html#$messages-detail
            if ($message[2] == 'yii\\db\\Command::query') 

                $is_full_cols       = (stripos($message[0], "SHOW FULL COLUMNS")===0);
                $is_create_table    = (stripos($message[0], "SHOW CREATE TABLE")===0);

                if ($is_full_cols OR $is_create_table)  
                    unset($messages[$index]);
                
             


        
        parent::collect($messages, $final);
    

然后配置我的应用程序以使用它

'log'       => [

        'targets'   => [
            ....
            [
                'class'         => 'common\components\CustomFileTarget',
                'categories'    => ['*'],
            ],
        ],

但我想避免在 Yii 调试器的数据库面板中找到这些消息。或者,更好的是,完全删除这些 SQL 的日志记录。 (可能这需要扩展主动查询基类)

对 Yii2 代码进行更多查找后,我发现了所有 SQL 的记录位置:它位于函数 queryInternal 中的文件 vendor\yiisoft\yii2\db\Command.php 中。我在想我应该重写这个类来重写这个函数,并重写ActiveQueryActiveRecord类来强制这些使用我重写的Command类......

【问题讨论】:

【参考方案1】:

对我来说,我发现在 config/web.php 中设置了 log 组件,您可以扩展 yii\log\FileTarget 以自定义正在记录的内容。

还有 Yii 调试器,我认为这就是您所指的。我不确定如何自定义,但你可以看看:cache site

【讨论】:

如果我扩展FileTarget,当然到日志文件我丢弃的消息不会被记录。我现在将尝试创建一个自定义面板来过滤掉无用的查询消息。

以上是关于Yii2:是不是可以从登录 Yii 调试器中过滤掉一些查询?的主要内容,如果未能解决你的问题,请参考以下文章

Yii2网格视图使用ajax而不是Pjax进行过滤

[YII2] 视图层过滤客户恶意代码

Yii2- Select2 按钮作为网格视图过滤器不过滤

Yii2 gridview过滤来自多个值的列表(不是下拉列表过滤器)

无论如何从Yii2中的前一个过滤器获取变量?

Yii2 GridView - 将搜索过滤器更改为onchange事件而不是提交