干货:yii日志功能详解

转载请注明来自souldak,微博:@evagle

一、基本日志功能
详细的介绍查看官网的document:http://www.yiiframework.com/doc/guide/1.1/en/topics.logging
也可以看 Yii 1.1 Application Development Cookbook  这本书很好

默认的日志是输出到protected/runtime/application.log 
如果需要修改那么需要在main.php里面的 components下面增加log配置,如下:
'preload' => array('log'),//这句也必须加上
'components' => array(
        'log'=>array(
            'class'=>'CLogRouter',
            'routes'=>array(
               //这是一个文件route表示category为test开头的所有类型的输出都会记录到runtime/test.log下面
                 array(
                     'class'=>'CFileLogRoute',
                     'levels'=>'trace, info, debug, warn, error, fatal, profile',
                     'categories'=>'test.*',
                     'maxFileSize'=>1048576,//单文件最大1G
                     'logFile'=>'test.log',
                 ),
                  //
 
//                开发过程中所有日志直接输出到浏览器了,这样不需要登录服务器看日志了    
                    
                 array(
                    'class' => 'CWebLogRoute',
                    'categories' => 'test.*',
                    'levels' => CLogger::LEVEL_PROFILE,
                    'showInFireBug' => true,
                    'ignoreAjaxInFireBug' => true,
                ),
                array(
                    'class' => 'CWebLogRoute',
                    'categories' => 'test.* ',
                ),

                array(
                    'class'=>'CEmailLogRoute',
                    'levels'=>'error, warning',
                    'emails'=>'admin@example.com',
                ),
            ),
        ),
 
    ),

如果在某处调用了Yii::log("jdkshgds","info",'test.xx');
这个log首先被记录在了内存中一个CLogger类的array中,然后会逐一的判断每个LogRoute,判断是否需要输出,注意是逐一判断,不是其中一个输出下一个就不管了。
拿上面的配置来说:
第一个CFileLogRoute,'categories'=>'test.*',levels里包含了info, test.xx满足条件,所以会执行,将这条log输出到test.log中,然后下一个CWebLogRoute, 'levels' => CLogger::LEVEL_PROFILE,。而这条log是info的,所以不会执行,再下一个CWebLogRoute,'categories' => 'test.* ',levels没指定,那就说不过滤,所以这个也会被执行,所以这条log将被输出到浏览器中。

二、profile功能
另外logger还有一个很强大的功能:profile, 
Yii::beginProfile('blockID');
...code block being profiled...
Yii::endProfile('blockID');
这样就能测试这个code block的执行效率了,非常的方便啊。
更详细的配置查看:http://www.yiiframework.com/doc/api/1.1/CProfileLogRoute

然后还有一个很BUG的功能,Profiling SQL Executions
很多时候sql语句写的不好会非常影响效率的,但是要确定哪一条语句影响了效率就需要profiling了。YII也提供了这个bug级别的功能。具体参看http://www.yiiframework.com/doc/api/1.1/CDbConnection#enableProfiling-detail
下面是截取的片段:

Profiling is especially useful when working with database since SQL executions are often the main performance bottleneck of an application. While we can manually insert beginProfile and endProfile statements at appropriate places to measure the time spent in each SQL execution, Yii provides a more systematic approach to solve this problem.

By setting CDbConnection::enableProfiling to be true in the application configuration, every SQL statement being executed will be profiled. The results can be readily displayed using the aforementioned CProfileLogRoute, which can show us how much time is spent in executing what SQL statement. We can also call CDbConnection::getStats() to retrieve the total number SQL statements executed and their total execution time.


三、BUG级功能:调试sql query每个语句执行的耗时
在配置中的log下加上下面这个Route
//这个配置专门负责数据库操作的profile
array(
       'class'=>'CProfileLogRoute',
       'levels' => CLogger::LEVEL_PROFILE,
       'showInFireBug' => true,
       'ignoreAjaxInFireBug' => true,
       'categories' => 'system.db.* ', //只记录db的操作日志,其他的忽略
),
然后在某个controller的某个action中加入:
Yii::beginProfile('db', 'pocketpet');
for($i=0;$i<1000;$i++){
      $user = UserModel::model()->findByPk("1");//这里只要是数据库操作就行,这个只是个例子
}
Yii::endProfile('db', 'pocketpet');
在浏览器中访问这个action,记得先打开firebug,然后firebug中就能看到如下图的记录:


相同的query会进行归类,计算total和average,这个对于分析还是非常有帮助的。
也可以将db的日志写到文件,配置如下(不建议使用,还是到浏览器用firebug方便):
array(
    'class'=>'CFileLogRoute',
    'levels' => CLogger::LEVEL_PROFILE,
    'categories' => 'system.db.* ', //只记录db的操作日志,其他的忽略
    'logFile'=>'db.log',
),


当然,想要生效还得有下面两步配置:
1. 记得在index.php, 中加入以下配置,高亮的那些
$yii = dirname(__FILE__).'/../yii/framework/yii.php';
$config = dirname(__FILE__).'/protected/config/main.php';

defined('YII_DEBUG') or define('YII_DEBUG',true);

defined('YII_DEBUG_SHOW_PROFILER') or define('YII_DEBUG_SHOW_PROFILER',true);
//enable profiling
defined('YII_DEBUG_PROFILING') or define('YII_DEBUG_PROFILING',true);
//trace level
defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);
//execution time
defined('YII_DEBUG_DISPLAY_TIME') or define('YII_DEBUG_DISPLAY_TIME',false);
require_once($yii);
Yii::createWebApplication($config)->run();
2. 在main.php主配置文件里面,的components db 里将enableProfiling设置为true

'components' => array(
'db' => array(
        'enableProfiling' => true, //这个是用来记录日志的,会记录每一条语句执行的时间
        'enableParamLogging' => true,//true表示包括sql语句的参数在内的信息都会记录到日志里,非常详细
    ),
)

四、调用示例
Yii::log("dfdf",CLogger::LEVEL_INFO,"example");
Yii::log("dfdf",CLogger::LEVEL_INFO,"example");
Yii::log("dfdf",CLogger::LEVEL_ERROR,"example");
Yii::trace("dfdf", "example");
Yii::trace('example trace message', 'example');
Yii::log('info', CLogger::LEVEL_INFO, 'example');
Yii::log('error', CLogger::LEVEL_ERROR, 'example');
Yii::log('trace', CLogger::LEVEL_TRACE, 'example');
Yii::log('warning', CLogger::LEVEL_WARNING, 'example');
Yii::beginProfile('db', 'example');
for($i=0;$i<1000;$i++){
    $user = UserModel::model()->findByPk("1");
}
Yii::endProfile('db', 'example');
echo 'done';







  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:在命令行窗口写入php artisan make:model Models\MenuModel用于创建模型时,出现此错误(Could not open input file: artisan)。这个错误提示说明找不到输入文件artisan。根据引用\[2\]中的说明,这可能是因为你没有把php.exe添加到环境变量中。你可以尝试直接进入php安装目录后再执行命令。在Windows下,你可以使用cd命令进入php安装目录,然后再执行命令。例如,你可以输入以下命令来执行php脚本:php -r echo('123')。引用\[3\]中提到,可以选择任何文件来运行,指定的PHP脚本并非必须要以.php为扩展名,它们可以有任意的文件名和扩展名。所以,你可以尝试使用相同的方法来执行yii脚本,确保你已经进入了yii脚本所在的目录,并且正确指定了文件名和扩展名。 #### 引用[.reference_title] - *1* [Could not open input file: artisan](https://blog.csdn.net/qq_33210743/article/details/78929525)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [PHP命令行提示“Could not open input file”解决方法](https://blog.csdn.net/weixin_39691535/article/details/101012516)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值