详解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注入点构造代码
Jun 14 PHP
应用开发中涉及到的css和php笔记分享
Aug 02 PHP
PHP隐形一句话后门,和ThinkPHP框架加密码程序(base64_decode)
Nov 02 PHP
分享一下贝贝成长进度的php代码
Sep 14 PHP
phpexcel导入excel数据使用方法实例
Dec 24 PHP
php使用CURL伪造IP和来源实例详解
Jan 15 PHP
PHP实现连接设备、通讯和发送命令的方法
Oct 13 PHP
PHP图像裁剪缩略裁切类源码及使用方法
Jan 07 PHP
PHP 数组基本操作方法详解
Jun 17 PHP
thinkPHP简单实现多个子查询语句的方法
Dec 05 PHP
PHP实现求解最长公共子串问题的方法
Nov 17 PHP
laravel-admin 在列表页添加自定义按钮的例子
Sep 30 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
火影忍者:这才是千手柱间和扉间的真正死因,角都就比较搞笑了!
2020/03/10 日漫
Yii2 assets清除缓存的方法
2016/05/16 PHP
Aster vs KG BO3 第二场2.19
2021/03/10 DOTA
JavaScript 拾漏补遗
2009/12/27 Javascript
基于jquery的无缝循环新闻列表插件
2011/03/07 Javascript
JS localStorage实现本地缓存的方法
2013/06/22 Javascript
跨域传值即主页面与iframe之间互相传值
2013/12/09 Javascript
原生JS实现仿淘宝网左侧商品分类菜单效果代码
2015/09/10 Javascript
JS JSOP跨域请求实例详解
2016/07/04 Javascript
layer弹出层框架alert与msg详解
2017/03/14 Javascript
利用vue开发一个所谓的数独方法实例
2017/12/21 Javascript
解决vue打包css文件中背景图片的路径问题
2018/09/03 Javascript
详解VUE单页应用骨架屏方案
2019/01/17 Javascript
vue实现固定位置显示功能
2019/05/30 Javascript
使用zrender.js绘制体温单效果
2019/10/31 Javascript
JavaScript设计模式之策略模式实现原理详解
2020/05/29 Javascript
Vue检测屏幕变化来改变不同的charts样式实例
2020/10/26 Javascript
kNN算法python实现和简单数字识别的方法
2014/11/18 Python
在Python程序中实现分布式进程的教程
2015/04/28 Python
python函数的5种参数详解
2017/02/24 Python
解决python升级引起的pip执行错误的问题
2018/06/12 Python
Python3使用SMTP发送带附件邮件
2020/06/16 Python
使用Python获取并处理IP的类型及格式方法
2018/11/01 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
2018/11/14 Python
PyCharm 专业版安装图文教程
2020/02/20 Python
css3让div随鼠标移动而抖动起来
2014/02/10 HTML / CSS
实例讲解CSS3中Transform的perspective属性的用法
2016/04/22 HTML / CSS
使用postMessage让 iframe自适应高度的方法示例
2019/10/08 HTML / CSS
canvas简单连线动画的实现代码
2020/02/04 HTML / CSS
几个SQL的面试题
2014/03/08 面试题
董事长职责范文
2013/11/08 职场文书
农村葬礼主持词
2014/03/31 职场文书
优秀党员先进材料
2014/12/18 职场文书
给老婆道歉的话
2015/01/20 职场文书
学生检讨书范文
2015/01/27 职场文书
html粘性页脚的具体使用
2022/01/18 HTML / CSS