详解PHP的Yii框架中日志的相关配置及使用


Posted in PHP onDecember 08, 2015

默认的日志是输出到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级别的功能。

三、Yii::log()和Yii::trace()的使用
首先在config文件中设置log

'log'=>array(
  'class'=>'CLogRouter',
  'routes'=>array(
    array(
      'class'=>'CFileLogRoute',//这表示把日志输出到文件中,下方有详细的
      'levels'=>'error, warning',
    ),
    array(
      'class'=>'CWebLogRoute',//这表示把日志显示在网页下方,下方有详细的
      'levels'=>'trace, info, error, warning',
      'categories'=>'cool.*,system.db.*',
    ),
  ),
),

日志路由class:

  • CDbLogRoute: 将信息保存到数据库的表中。
  • CEmailLogRoute: 发送信息到指定的 Email 地址。
  • CFileLogRoute: 保存信息到应用程序 runtime 目录中的一个文件中。
  • CWebLogRoute: 将 信息 显示在当前页面的底部。
  • CProfileLogRoute: 在页面的底部显示概述(profiling)信息。

信息级别levels:

  • trace: 这是在 Yii::trace 中使用的级别。它用于在开发中 跟踪程序的执行流程。
  • info: 这个用于记录普通的信息。
  • profile: 这个是性能概述(profile)。下面马上会有更详细的说明。
  • warning: 这个用于警告(warning)信息。
  • error: 这个用于致命错误(fatal error)信息。

分类categories:

可以自定义,但在输出函数里要对应才会被写入日志里
(例如上边写的是 cool.* 和 system.db.* ,就会把相应分类的信息写入日志,请结合下文来理解)

设置完了,就可以用写入日志的函数来记录了:

Yii::trace('My log message.','cool.pd');
//cool.pd属于cool.*分类,所以会被写入日志
Yii::log('My log message.','info','cool.collectpd');
//log定义级别为info,结合上文,第一个logclass会忽略,不会被写入文件,但会被第二个logclass接收,写入日志在网络下方显示。

trace()和log()的区别:
trace()只会在调试模式下生效,即开启debug的时候
trace()不分level,但log()能设置levels参数

四、调试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中就能看到如下图的记录:

详解PHP的Yii框架中日志的相关配置及使用

相同的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语句的参数在内的信息都会记录到日志里,非常详细
  ),
)
PHP 相关文章推荐
PHP 截取字符串 分别适合GB2312和UTF8编码情况
Feb 12 PHP
smarty模板嵌套之include与fetch性能测试
Dec 05 PHP
一个PHP分页类的代码
May 18 PHP
php 字符串压缩方法比较示例
Jan 23 PHP
PHP与MYSQL中UTF8 中文排序示例代码
Oct 23 PHP
PHP中让curl支持sock5的代码实例
Jan 21 PHP
php生成圆角图片的方法
Apr 07 PHP
thinkphp3.2中Lite文件替换框架入口文件或应用入口文件的方法
May 21 PHP
Zend Framework教程之Zend_Config_Ini用法分析
Mar 23 PHP
PHP 获取指定地区的天气实例代码
Feb 08 PHP
2017年最好用的9个php开发工具推荐(超好用)
Oct 23 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
Mar 23 PHP
UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
Dec 08 #PHP
学习php设计模式 php实现模板方法模式
Dec 08 #PHP
PHP7正式版测试,性能惊艳!
Dec 08 #PHP
学习php设计模式 php实现命令模式(command)
Dec 08 #PHP
学习php设计模式 php实现合成模式(composite)
Dec 08 #PHP
如何使用GDB调试PHP程序
Dec 08 #PHP
PHP MPDF中文乱码的解决方式
Dec 08 #PHP
You might like
PHP 八种基本的数据类型小结
2011/06/01 PHP
php的zip解压缩类pclzip使用示例
2014/03/14 PHP
使用PHP编写发红包程序
2015/07/22 PHP
PHP和MySql中32位和64位的整形范围是多少
2016/02/18 PHP
PHP正则替换函数preg_replace()报错:Notice Use of undefined constant的解决方法分析
2017/02/04 PHP
yii2 数据库读写分离配置示例
2017/02/10 PHP
phpstudy2018升级MySQL5.5为5.7教程(图文)
2018/10/24 PHP
PHP PDOStatement::columnCount讲解
2019/01/30 PHP
PHP工厂模式、单例模式与注册树模式实例详解
2019/06/03 PHP
PHP rsa加密解密算法原理解析
2020/12/09 PHP
JS获取下拉列表所选中的TEXT和Value的实现代码
2014/01/11 Javascript
JavaScript编程的10个实用小技巧
2014/04/18 Javascript
javascript中通过arguments参数伪装方法重载
2014/10/08 Javascript
JavaScript实现更改网页背景与字体颜色的方法
2015/02/02 Javascript
JavaScript常用脚本汇总(二)
2015/03/04 Javascript
jquery实现翻动fadeIn显示的方法
2015/03/05 Javascript
js获取表格的行数和列数的方法
2015/10/23 Javascript
JS功能代码集锦
2016/05/04 Javascript
vue实现随机验证码功能的实例代码
2019/04/30 Javascript
详解vue-video-player使用心得(兼容m3u8)
2019/08/23 Javascript
three.js 如何制作魔方
2020/07/31 Javascript
Python GAE、Django导出Excel的方法
2008/11/24 Python
python探索之BaseHTTPServer-实现Web服务器介绍
2017/10/28 Python
Python计算一个给定时间点前一个月和后一个月第一天的方法
2018/05/29 Python
解决使用PyCharm时无法启动控制台的问题
2019/01/19 Python
Python实现深度遍历和广度遍历的方法
2019/01/22 Python
Django实现跨域请求过程详解
2019/07/25 Python
Python下opencv图像阈值处理的使用笔记
2019/08/04 Python
python批量修改交换机密码的示例
2020/09/22 Python
Python安装并操作redis实现流程详解
2020/10/13 Python
网络艺术零售业的先驱者:artrepublic
2017/09/26 全球购物
外贸公司实习自我鉴定
2013/09/24 职场文书
产品促销活动策划书
2014/01/15 职场文书
科长竞聘演讲稿
2014/05/16 职场文书
保姆聘用合同
2015/09/21 职场文书
教师教育心得体会
2016/01/19 职场文书