Home > php教程 > PHP开发 > body text

Detailed explanation of log usage in YII Framework tutorial

高洛峰
Release: 2016-12-27 14:11:42
Original
1238 people have browsed it

The example in this article describes the usage of YII Framework framework log. Share it with everyone for your reference, the details are as follows:

The role of logs (1000 words are omitted here)

The logs in YII are very good and powerful, allowing you to store log information in the database. Send it to the designated email and store it in a file. The opinion display page can even be used for performance analysis.

Basic configuration of logs in YII:/yii_dev/testwebap/protected/config/main.php

'log'=>array(
  'class'=>'CLogRouter',
  'routes'=>array(
    array(
      'class'=>'CFileLogRoute',
      'levels'=>'error, warning',
    ),
    // uncomment the following to show log messages on web pages
    /*
    array(
      'class'=>'CWebLogRoute',
    ),
    */
  ),
),
Copy after login

Basic use of logs in YII:

Can be provided by YII Yii::log and Yii::trace output log information. The difference between the two can be seen by looking at the definition.

Function definition

public static function trace($msg,$category='application')
{
  if(YII_DEBUG)
    self::log($msg,CLogger::LEVEL_TRACE,$category);
}
public static function log($msg,$level=CLogger::LEVEL_INFO,$category='application')
{
  if(self::$_logger===null)
    self::$_logger=new CLogger;
  if(YII_DEBUG && YII_TRACE_LEVEL>0 && $level!==CLogger::LEVEL_PROFILE)
  {
    $traces=debug_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);
}
Copy after login

$msg: The log information you want to output

$category: The category to which the log information belongs

$level: The level of the log information :

const LEVEL_TRACE='trace'; used in debugging environment, tracking program execution process
const LEVEL_WARNING='warning'; warning message
const LEVEL_ERROR='error'; fatal error message
const LEVEL_INFO='info';Common prompt information
const LEVEL_PROFILE='profile';Performance debugging information

Basic usage example

<?php
class DefaultController extends Controller
{
  public function actionCache ()
  {
    $category=&#39;system.testmod.defaultController&#39;;
    $level=CLogger::LEVEL_INFO;
    $msg=&#39;action begin &#39;;
    Yii::log($msg,$level,$category);
  }
}
Copy after login

Log output location in YII

As mentioned above, the output location of the log in YII can be defined in many locations. Mainly through configuration file modification, for example:

&#39;log&#39;=>array(
  &#39;class&#39;=>&#39;CLogRouter&#39;,
  &#39;routes&#39;=>array(
    array(
      &#39;class&#39;=>&#39;CFileLogRoute&#39;,
      &#39;levels&#39;=>&#39;error, warning&#39;,
    ),
    // uncomment the following to show log messages on web pages
    array(
      &#39;class&#39;=>&#39;CWebLogRoute&#39;,
    ),
  ),
),
Copy after login

is not only output to the log file, but also output to the web page.

In the configuration file:

routes is used to configure the location of log output,
class is the log, the class name of the log route
levels is the top level of the log, a string sequence, Easy to use and divide. Specifically corresponds to the constants in CLoger

Note:

The storage location of the log file is:/yii_dev/testwebap/protected/runtime/application.log

Introduced by the official log It is very detailed, but the Chinese translation of the second half is missing, so here is the translation to complete it.

Yii provides a flexible and scalable logging function. Recorded logs can be classified by log level and information classification. By using level and category filters, selected information can be further routed to different destinations, such as a file, email, browser window, etc.

1. Information recording

Information can be recorded through Yii::log or Yii::trace. The difference is that the latter only logs information when the application is running in debug mode.

Yii::log($message, $level, $category);
Yii::trace($message, $category);
Copy after login

When recording information, we need to specify its category and level. The category is a string in a format similar to a path alias. For example, if a message is recorded in CController, we can use system.web.CController as the classification. The information level should be one of the following values:

trace: This is the level used in Yii::trace. It is used to track the execution flow of a program during development.
info: This is used to record general information.
profile: This is the performance overview (profile). More detailed instructions will follow shortly.
warning: This is used for warning messages.
error: This is used for fatal error messages.

2. Information routing

The information recorded through Yii::log or Yii::trace is stored in memory. We usually need to display them in a browser window, or save them to some persistent storage such as files or emails. This is called message routing, i.e. sending messages to different destinations.

In Yii, information routing is managed by an application component called CLogRouter. It is responsible for managing a series of things called log routing. Each log route represents a separate log destination. Messages sent through a log route are filtered by their level and category.

To use message routing, we need to install and preload a CLogRouter application component. We also need to configure its routes attribute for the log routes we want. The code below demonstrates a required application configuration example:

array(
  ......
  &#39;preload&#39;=>array(&#39;log&#39;),
  &#39;components&#39;=>array(
    ......
    &#39;log&#39;=>array(
      &#39;class&#39;=>&#39;CLogRouter&#39;,
      &#39;routes&#39;=>array(
        array(
          &#39;class&#39;=>&#39;CFileLogRoute&#39;,
          &#39;levels&#39;=>&#39;trace, info&#39;,
          &#39;categories&#39;=>&#39;system.*&#39;,
        ),
        array(
          &#39;class&#39;=>&#39;CEmailLogRoute&#39;,
          &#39;levels&#39;=>&#39;error, warning&#39;,
          &#39;emails&#39;=>&#39;admin@example.com&#39;,
        ),
      ),
    ),
  ),
)
Copy after login

In the above example, we have defined two log routes. The first is CFileLogRoute, which saves the information in a file located in the application's runtime directory. And only information with level trace or info and categories beginning with system. will be saved. The second route is CEmailLogRoute, which will send information to the specified email address, and only those with level error or warning will be sent.

In Yii, the following log routes are available:

CDbLogRoute: Save information to a database table.
CEmailLogRoute: Send information to the specified Email address.
CFileLogRoute: Saves information to a file in the application's runtime directory.
CWebLogRoute: Display information at the bottom of the current page.
CProfileLogRoute: Display profiling information at the bottom of the page.

Information: Information routing occurs when the onEndRequest event at the end of the current request cycle is triggered. To explicitly terminate the current request process, call CApplication::end() instead of using die() or exit(), because CApplication::end() will trigger the onEndRequest event so that the information will be logged smoothly.

3. Information filtering

正如我们所提到的,信息可以在他们被发送到一个日志路由之前通过它们的级别和分类过滤。 这是通过设置对应日志路由的 levels 和 categories 属性完成的。 多个级别或分类应使用逗号连接。

由于信息分类是类似 xxx.yyy.zzz 格式的,我们可以将其视为一个分类层级。 具体地,我们说 xxx 是 xxx.yyy的父级,而xxx.yyy 又是 xxx.yyy.zzz 的父级。 这样我们就可以使用 xxx.* 表示分类 xxx 及其所有的子级和孙级分类

4. 记录上下文信息

从版本 1.0.6 起,我们可以设置记录附加的上下文信息, 比如 PHP 的预定义变量(例如 $_GET, $_SERVER),session ID,用户名等。 这是通过指定一个日志路由的 CLogRoute::filter属性为一个合适的日志过滤规则实现的。

框架可能在许多数情况下会用到日志过滤器CLogFilter来过滤日志。默认情况下,CLogFilter日志消息包含了许多系统上下文信息的变量,像$ _GET,$_SERVER。 CLogFilter也可以配置的前缀与会话ID,用户名等,我们在检查无数记录的消息每个记录的消息时,这可能会极大地简化了搜索难度

下面的配置显示了如何启用日志记录的上下文信息。请注意,每个日志路由可能有其自己的日志过滤器。 默认情况下,日志路由不会有日志筛选器。

array(
  ......
  &#39;preload&#39;=>array(&#39;log&#39;),
  &#39;components&#39;=>array(
    ......
    &#39;log&#39;=>array(
      &#39;class&#39;=>&#39;CLogRouter&#39;,
      &#39;routes&#39;=>array(
        array(
          &#39;class&#39;=>&#39;CFileLogRoute&#39;,
          &#39;levels&#39;=>&#39;error&#39;,
          &#39;filter&#39;=>&#39;CLogFilter&#39;,
        ),
        ...other log routes...
      ),
    ),
  ),
)
Copy after login

从版本1.0.7开始,Yii的日志记录可以采用堆栈的方式记录消息,此功能默认是关闭的,因为它会降低性能。要使用此功能,只需在入口脚本(前includingyii.php)定义一个命名为YII_TRACE_LEVEL的常量即一个大于0的整数。 Yii将在堆栈信息中追加应用程序要到的每一个文件名和行号。可以通过设置YII_TRACE_LEVEL来设定堆栈的层数。这种方式在开发阶段特别有用,因为它可以帮助我们确定触发跟踪消息的地方。

5. Performance Profiling 性能分析

性能分析是一类特殊类型的消息记录。性能分析可用于测量指定代码块所需的时间,并找出性能瓶颈是什么。

要使用性能分析日志,我们需要确定哪些代码块需要分析。我们要在分析性能的代码短的开始和结尾添加如下方法:

Yii::beginProfile(&#39;blockID&#39;);
...code block being profiled...
Yii::endProfile(&#39;blockID&#39;);
Copy after login

其中blockID是一个标识代码块的唯一ID。

注意,这些方法不能交叉嵌套

为了显示分析结果,我们需要为CLogRouter增加CProfileLogRoute路由。然后通过CProfileLogRoute可以把性能测试结果显示在当前页面结束。

6. Profiling SQL Executions 分析SQL执行

在数据库开发中分析是特别有用的,因为SQL执行往往是应用程序的主要性能瓶颈。尽管我们可以手动在每个SQL执行的适当的地方插入beginProfile和endProfile来衡量花费的时间,但从1.0.6版本开始,Yii提供了更系统的方法来解决这个问题。

再实际的应用程序当中通过设置CDbConnection::enableProfiling爱分析每一个正在执行的SQL语句。使用 CProfileLogRoute,结果可以很容易地显示。它可以显示我们是在执行什么SQL语句花费多少时间。我们也可以调用CDbConnection:getStats()来分析检索SQL语句的执行总数和其总的执行时间。

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

更多YII Framework框架教程之日志用法详解相关文章请关注PHP中文网!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Recommendations
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!