详解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 intval的测试代码发现问题
Jul 27 PHP
PHP学习之字符串比较和查找
Apr 17 PHP
PHP调用Webservice实例代码
Jul 29 PHP
php数组函数序列之each() - 获取数组当前内部指针所指向元素的键名和键值,并将指针移到下一位
Oct 31 PHP
PHP中替换键名的简易方法示例详解
Jan 07 PHP
PhpDocumentor 2安装以及生成API文档的方法
May 21 PHP
PHP递归遍历多维数组实现无限分类的方法
May 06 PHP
PHP基本语法实例总结
Sep 09 PHP
php封装的图片(缩略图)处理类完整实例
Oct 19 PHP
php 删除指定文件夹的实例讲解
Jul 25 PHP
PHP实现的获取文件mimes类型工具类示例
Apr 08 PHP
HTTP头隐藏PHP版本号实现过程解析
Dec 09 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 中的一些经验积累
2006/10/09 PHP
PHP实现下载远程图片保存到本地的方法
2017/06/19 PHP
PHP简单计算两个时间差的方法示例
2017/06/20 PHP
Firefox window.close()的使用注意事项
2009/04/11 Javascript
jQuery学习笔记[1] jQuery中的DOM操作
2010/12/03 Javascript
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
2011/01/08 Javascript
JQuery UI的拖拽功能实现方法小结
2012/03/14 Javascript
Javascript中克隆一个数组的实现代码
2013/12/06 Javascript
js Calender控件使用详解
2015/01/05 Javascript
深入理解JavaScript系列(41):设计模式之模板方法详解
2015/03/04 Javascript
javascript嵌套函数和在函数内调用外部函数的区别分析
2016/01/31 Javascript
jquery实现一个简单的表单验证实例
2016/03/30 Javascript
遍历js中对象的属性和值的实例
2016/11/21 Javascript
简单谈谈gulp-changed插件
2017/02/21 Javascript
Vue.js tab实现选项卡切换
2017/05/16 Javascript
angularjs+bootstrap实现自定义分页的实例代码
2017/06/19 Javascript
javaScript和jQuery自动加载简单代码实现方法
2017/11/24 jQuery
Node.js实现mysql连接池使用事务自动回收连接的方法示例
2018/02/03 Javascript
使用vue2实现带地区编号和名称的省市县三级联动效果
2018/11/05 Javascript
jQuery实现的简单歌词滚动功能示例
2019/01/07 jQuery
element-ui table组件如何使用render属性的实现
2019/11/04 Javascript
原生js实现的金山打字小游戏(实例代码详解)
2020/03/16 Javascript
windows下python安装paramiko模块和pycrypto模块(简单三步)
2017/07/06 Python
python快速建立超简单的web服务器的实现方法
2018/02/17 Python
Python3匿名函数lambda介绍与使用示例
2019/05/18 Python
Python Web版语音合成实例详解
2019/07/16 Python
Python综合应用名片管理系统案例详解
2020/01/03 Python
python实现扫雷小游戏
2020/04/24 Python
Python中zip函数如何使用
2020/06/04 Python
Godiva巧克力英国官网:比利时歌帝梵巧克力
2018/08/28 全球购物
我读书我快乐演讲稿
2014/05/07 职场文书
做人民满意的公务员活动方案
2014/08/25 职场文书
党员群众路线自我剖析材料
2014/10/06 职场文书
建国大业电影观后感
2015/06/01 职场文书
古诗之爱国古诗5首
2019/09/20 职场文书
Win11怎么解除儿童账号限制?Win11解除微软儿童账号限制方法
2022/07/07 数码科技