详解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分页时出现的Fatal error的解决方法
Apr 18 PHP
PHP网站备份程序代码分享
Jun 10 PHP
Apache中php.ini的设置方法
Feb 28 PHP
php 获取本地IP代码
Jun 23 PHP
php实现图片添加水印功能
Feb 13 PHP
PHP中new static() 和 new self() 的区别介绍
Jan 09 PHP
PHP结合jQuery.autocomplete插件实现输入自动完成提示的功能
Apr 27 PHP
php遍历替换目录下文件指定内容的方法
Nov 10 PHP
yii2简单使用less代替css示例
Mar 10 PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
Oct 23 PHP
PHP配置ZendOpcache插件加速
Feb 14 PHP
PHP如何通过date() 函数格式化显示时间
Nov 13 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创建图像具体步骤
2017/03/13 PHP
js格式化货币数据实现代码
2013/09/04 Javascript
Javascript事件实例详解
2013/11/06 Javascript
jquery live()重复绑定的解决方法介绍
2014/01/03 Javascript
JavaScript模块规范之AMD规范和CMD规范
2015/10/27 Javascript
JavaScript如何调试有哪些建议和技巧附五款有用的调试工具
2015/10/28 Javascript
jquery 中toggle的2种用法详解(推荐)
2016/09/02 Javascript
详解handlebars+require基本使用方法
2016/12/21 Javascript
世界上最短的数字判断js代码
2019/09/09 Javascript
JavaScript 声明私有变量的两种方式
2021/02/05 Javascript
[50:50]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第一场 12.20
2020/12/23 DOTA
Python实现的检测web服务器健康状况的小程序
2014/09/17 Python
Python实现两个list对应元素相减操作示例
2017/06/09 Python
Sanic框架Cookies操作示例
2018/07/17 Python
python使用numpy读取、保存txt数据的实例
2018/10/14 Python
利用Python如何实现一个小说网站雏形
2018/11/23 Python
python实现一个简单的udp通信的示例代码
2019/02/01 Python
在pytorch中查看可训练参数的例子
2019/08/18 Python
如何在mac版pycharm选择python版本
2020/07/21 Python
python opencv pytesseract 验证码识别的实现
2020/08/28 Python
CSS3中border-radius属性设定圆角的使用技巧
2016/05/10 HTML / CSS
HTML5打开本地app应用的方法
2016/03/31 HTML / CSS
html5文本内容_动力节点Java学院整理
2017/07/11 HTML / CSS
前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)
2018/07/12 HTML / CSS
The Athlete’s Foot新西兰:新西兰最大的运动鞋零售商
2019/12/23 全球购物
80后职场人的职业生涯规划
2014/03/08 职场文书
工程造价专业大学生职业规划范文
2014/03/09 职场文书
软件项目开发计划书
2014/05/01 职场文书
高效课堂标语
2014/06/26 职场文书
机关党总支领导班子整改方案
2014/09/20 职场文书
2015年乡镇卫生院工作总结
2015/04/22 职场文书
惹女朋友生气检讨书
2015/05/06 职场文书
2016习总书记系列重要讲话心得体会
2016/01/15 职场文书
终止合同协议书范本
2016/03/22 职场文书
聊聊SpringBoot自动装配的魔力
2021/11/17 Java/Android
MySQL库表太大怎么办? 数据库分库分表项目实践
2022/04/11 MySQL