`
OrangeHolic
  • 浏览: 260723 次
  • 来自: 北京
社区版块
存档分类
最新评论

Yii的log分析

    博客分类:
  • Yii
Yii 
阅读更多
我们可以通过Yii的日志级别和信息分类进行归类,所选的信息还可以进一步设置信息路由到答不同的目的地,例如一个文件,数据库,Email,浏览器窗口等。

日志级别有:

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

在 Yii 中,有下列几种日志路由可用:

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

信息可以通过 Yii::log 或 Yii::trace 记录。其 区别是后者只在当应用程序运行在 调试模式(debug mode) 中时才会记录信息。
Yii::log($message, $level, $category);
Yii::trace($message, $category);


示例:
需先在main.php中进行配置,例子选择将日志存储在文件(系统默认为webapp\protected\runtime\application.log)中,为只存储trace和error级别,过滤以orange开始的log。
'components'=>array(
     ...............
     'log'=>array(
               'class'=>'CLogRouter',
               'routes'=>array(
                    array(
                         'class'=>'CFileLogRoute',
                         'levels'=>'trace,error',
                         'categories'=>'orange.*'
                    ),
               ),
          ),
     ...............
)

 
在控制器中定义方法并执行,在此为OrangeController控制器
 public function actionTest(){
        Yii::log('This is a  trace log','trace','orange.test');
    }

执行以后可在日志文件中看到我们的trace信息,为
2012/09/28 15:40:11 [trace] [orange.test] This is a  trace log
in D:\PHP\www\yii\orange\protected\controllers\OrangeController.php (24)



Yii的日志主要由CLogger,CLogRoute,CLogRouter三类来完成,其中CLogger在内存中记录日志信息,CLogRoute用不同的方式处理日志信息,CLogRouter将CLogger记录的信息发送给各个CLogRoute进行处理。类图如下:

在此简单介绍一下路由的整个过程:
1.Yii类中CLogger的实例化,调用 Yii::log('This is a  trace log','trace','orange.test');时,Yii类(其实是YiiBase是如何反应的。
代码路径:framework\YiiBase.php#461
public static function log($msg,$level=CLogger::LEVEL_INFO,$category='application')
     {
          if(self::$_logger===null)
               self::$_logger=new CLogger;//如果_logger为null,则实例化Clogger类
          if(YII_DEBUG && YII_TRACE_LEVEL>0 && $level!==CLogger::LEVEL_PROFILE)
          {
            // YII_TRACE_LEVEL 设置backtrace 显示的内容条数,
            //这个常量会在debug_backtrace 函数返回信息中,获取指定条数,
            //如果为0(默认) 则为全部显示
               $traces=debug_backtrace();
               //debug_backtrace() 函数生成一个 backtrace,返回关联数组的数组,可以参考文档
               $count=0;
               foreach($traces as $trace)
               {
                    if(isset($trace['file'],$trace['line']) && strpos($trace['file'],YII_PATH)!==0)
                    {
                         $msg.="\nin ".$trace['file'].' ('.$trace['line'].')';
                         if(++$count>=YII_TRACE_LEVEL)
                              break;
                    }
               }
          }
          self::$_logger->log($msg,$level,$category);//调用_logger的方法处理日志
     }

主要功能就是上下2条语句。
2.CLogger的log方法
class CLogger extends CComponent
{
     const LEVEL_TRACE='trace';
     const LEVEL_WARNING='warning';
     const LEVEL_ERROR='error';
     const LEVEL_INFO='info';
     const LEVEL_PROFILE='profile';
     .......................
    public function log($message,$level='info',$category='application')
     {
        //保存日志(日志为一个数组,包括信息、级别、过滤、发生时间4内容)
          $this->_logs[]=array($message,$level,$category,microtime(true));
          //记录的日志个数自增1
          $this->_logCount++;
        //autoFlush为整数,表示在它们被刷新到目录前多少信息应该被记录。
        //默认到10,000, 意味着每10,000条信息,这个flush方法自动被发起一次信息。
        //如果为0,它意味着信息不会被自动刷新,一直保存到_logs[]中,直到调用raise onFlush事。
        //_processing表示我们是否正在处理log
          if($this->autoFlush>0 && $this->_logCount>=$this->autoFlush && !$this->_processing)
          {
               $this->_processing=true;
            //autoDump默认时,这个属性为false,意味着每次flush()日志之后已经过滤的信息仍然保存在内在中。
            //如果为true,已过滤的信息被保存在实际的媒介中
               $this->flush($this->autoDump);
               $this->_processing=false;
          }
     }
  ...........................
     public function flush($dumpLogs=false)
     {
          $this->onFlush(new CEvent($this, array('dumpLogs'=>$dumpLogs)));
          $this->_logs=array();//清空日志
          $this->_logCount=0;
     }

     public function onFlush($event)
     {
        //唤醒绑定在onFlush事件处理函数
          $this->raiseEvent('onFlush', $event);
     }
................................
}

3.绑定在onFlush事件处理函数
这是我们的CLogRouter就出场了,CWebApplication根据mian.php中的配置实例化CLogRouter,并执行其init方法
class CLogRouter extends CApplicationComponent
{
     private $_routes=array();
     public function init()
     {
          parent::init();
          foreach($this->_routes as $name=>$route)
          {
            //读取各个CLogRoute的配置,实例化
               $route=Yii::createComponent($route);
            //调用各个CLogRoute的init方法
               $route->init();
            //保存各个CLogRoute到_routes中
               $this->_routes[$name]=$route;
          }
        //给CLogger onFlush事件绑定处理函数,为本类的collectLogs方法
          Yii::getLogger()->attachEventHandler('onFlush',array($this,'collectLogs'));
         //给CWebApplication  onEndRequest事件绑定处理函数,为本类的processLogs方法
          Yii::app()->attachEventHandler('onEndRequest',array($this,'processLogs'));
     }
    ..........................
     //收集log
   public function collectLogs($event)
     {
          $logger=Yii::getLogger();
          $dumpLogs=isset($event->params['dumpLogs']) && $event->params['dumpLogs'];
          foreach($this->_routes as $route)
          {
               if($route->enabled)
                    //调用各个CLogRoute的collectLogs到记录所有日志的CLogger类中按照
                   //自己的level和categories取出自己处理的log,也可立刻处理log(这也要看dumplogs的真假,为真则为立即处理)
                    $route->collectLogs($logger,$dumpLogs);
          }
     }
  //收集处理log
     public function processLogs($event)
     {
          $logger=Yii::getLogger();
          foreach($this->_routes as $route)
          {
               if($route->enabled)
                    //同上,但是此处为立刻处理log
                    $route->collectLogs($logger,true);
          }
     }
..................
}


4.调用各个CLogRoute处理日志,CLogRoute的collectLogs方法
abstract class CLogRoute extends CComponent
{
       public $levels='';//过滤log用
       public $categories='';//过滤log用
       ........................
      public function collectLogs($logger, $processLogs=false)
     {
          //按照过滤条件到CLogger中去log
          $logs=$logger->getLogs($this->levels,$this->categories);
          $this->logs=empty($this->logs) ? $logs : array_merge($this->logs,$logs);
          //如果设置要立刻处理
          if($processLogs && !empty($this->logs))
          {
               if($this->filter!==null)
                    Yii::createComponent($this->filter)->filter($this->logs);
               if($this->logs!==array())
                    //处理
                    $this->processLogs($this->logs);
               $this->logs=array();
          }
     }

     /**
     *处理日志信息并发送它们到指定的目标。 派生子类必须实现这个方法。
     *$logs为信息列表。每一个数组元素表示一个信息, 有下面的结构: array(
     *[0] => message (string)
     *[1] => level (string)
     *[2] => category (string)
     *[3] => timestamp (float, 从 microtime(true)获取)
     *  )
     */
     abstract protected function processLogs($logs);
  ........................
}


  其中CDbLogRoute实现方式为

   
 protected function processLogs($logs)
     {
          $command=$this->getDbConnection()->createCommand();
          foreach($logs as $log)
          {
               //遍历数组插入到数据库
               $command->insert($this->logTableName,array(
                    'level'=>$log[1],
                    'category'=>$log[2],
                    'logtime'=>(int)$log[3],
                    'message'=>$log[0],
               ));
          }
     }









  • 大小: 59.8 KB
分享到:
评论
1 楼 xq_blessing 2012-09-29  
Yii framework非常好的php框架,偶也正在研究中!学习了

相关推荐

    php yii源码分析

    在分析 Yii 源码时,我们首先要理解框架的基本结构和核心组件的工作原理。 1. **入口文件(index.php)**: 入口文件是每个 Web 应用程序的起点,对于 Yii 而言,`index.php` 文件是应用的入口。在这个文件中,Yii...

    yii2 通用后台系统

    Yii2 的 `yii\log` 组件可以帮助记录和分析系统运行中的事件和异常,而 `yii\swiftmailer` 可以方便地发送邮件通知。API接口开发则可以利用Yii2的RESTful特性,快速构建符合REST原则的API,方便前后端分离的项目开发...

    Yii2实现log输出到file及database的方法

    `yii\log\FileTarget`类用于将日志记录到文件。具体配置如下: ```php 'components' => [ 'log' => [ 'targets' => [ [ 'class' => 'yii\log\FileTarget', 'exportInterval' => 1, ], ], ], ] ``` 其中,`...

    YII2框架中日志的配置与使用方法实例分析

    本文将详细介绍YII2框架中日志的配置与使用方法,并通过实例分析来展示其功能和操作技巧。 首先,了解YII2日志组件的核心概念是至关重要的。YII2的日志组件可以理解为一个能够根据设定的规则记录应用运行过程中各种...

    yii2使用SeasLog写日志

    在PHP开发过程中,日志记录是一项非常重要的任务,它能够帮助开发者追踪代码执行过程中的错误、性能...在实际开发中,正确地记录和分析日志对于问题排查和系统监控至关重要,而SeasLog无疑为这个过程提供了有力的支持。

    YII Framework框架教程之日志用法详解

    最基础的是`Yii::log`方法,它可以输出不同级别(如错误、警告、信息、性能分析等)的日志消息。而`Yii::trace`方法则是一种特殊的日志记录,它专门用于在调试模式下追踪程序执行流程。两者的区别在于`Yii::trace`在...

    整合日志,权限,方便高效开发的yii项目

    1. **日志管理**:在Yii2中,日志是通过`Yii::$app->log`组件进行管理的。开发者可能已经设置好了不同的日志目标,如文件、数据库、邮件等,以便记录不同级别的信息(如错误、警告、调试等),这对于调试和问题追踪...

    yii2.0中文手册

    - 使用Yii的调试工具(Debug Toolbar和Debug Panel)可以方便地查看和分析应用性能。 10. **错误处理与日志记录**: - 错误处理由`yii\base\ErrorHandler`组件处理,可以捕获和报告PHP错误和异常。 - 日志组件`...

    Yii2框架中日志的使用方法分析

    在Yii2中,Logger类提供了log()方法,这是记录日志的基本方式。例如,我们要记录一个错误级别的日志信息,可以使用以下代码: ```php Yii::getLogger()->log('yoursitehasbeenhacked', Logger::LEVEL_ERROR); ``` ...

    关于Yii2框架跑脚本时内存泄漏问题的分析与解决

    深入分析后,我们发现内存泄漏的根本原因在于Yii2框架的`log`功能。在`vendor/yiisoft/yii2/log/Logger.php`文件的`log`函数中,当`traceLevel`大于0时,会收集调用堆栈信息以记录日志。这部分代码在循环中保存了多...

    yii2框架restful url接口 认证内容的开发的分享

    Yii2提供了丰富的组件和工具来支持这些功能,如`\yii\web\Response`可以方便地设置返回的HTTP状态码和数据格式,`\yii\log\Logger`可以帮助我们记录和分析应用日志。 总的来说,Yii2框架为开发RESTful URL接口提供...

    Yii框架应用组件用法实例分析

    例如,log组件用于记录应用程序运行时的信息,这是程序调试时非常重要的组件。你还可以在bootstrap中使用闭包来引导启动自定义的组件,这样可以不必直接返回一个实例化的组件对象,而是在需要的时候通过闭包进行实例...

    Yii调试查看执行SQL语句的方法

    在这个工具栏中,你可以找到“SQL”选项卡,它会列出所有执行过的SQL语句以及它们的执行时间,这对于分析查询性能很有帮助。 除了使用调试工具栏,你还可以通过其他方式获取SQL日志。例如,可以通过`CLogger`类的`...

    Yii2框架配置文件(Application属性)与调试技巧实例分析

    本文实例讲述了Yii2框架配置文件(Application属性)与调试技巧。分享给大家供大家参考,具体如下: 配置文件 ... 'bootstrap' => ['log'], 'components' => [ 'request' => [ // !!! insert a secret key

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

    默认情况下,Yii框架会把所有日志信息记录在`protected/runtime/application.log`文件中,但是这个默认配置可能不满足所有场景的需求。因此,开发者可以通过配置来改变日志记录的方式和位置。配置日志系统需要在入口...

    yii2-mougrim-logger

    该扩展提供了所有期望分析的日志。好处具有下一个优点: 灵活的配置; 类似于Apache log4php的界面(具有调试日志级别); 高于yii2记录器性能。 有关更多信息和基准测试结果,请参见。安装安装此扩展的首选方法是...

    Yii框架弹出窗口组件CJuiDialog用法分析

    Yii框架中的CJuiDialog组件是一个用于创建弹出对话框的工具,它是基于jQuery UI库的Dialog组件。本文将深入探讨CJuiDialog的用法和相关属性。 首先,使用CJuiDialog需要在视图文件中调用`$this->beginWidget()`和`$...

Global site tag (gtag.js) - Google Analytics