>  기사  >  php教程  >  YII Framework 튜토리얼의 로그 사용법에 대한 자세한 설명

YII Framework 튜토리얼의 로그 사용법에 대한 자세한 설명

高洛峰
高洛峰원래의
2016-12-27 14:11:421294검색

이 글의 예시에서는 YII 프레임워크 프레임워크 로그의 사용법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 자세한 내용은 다음과 같습니다.

로그의 역할(여기서 1000 단어는 생략됨)

YII의 로그는 매우 훌륭하고 강력하므로 다음을 수행할 수 있습니다. 로그 정보를 데이터베이스에 저장하고 지정된 이메일로 전송하여 파일로 저장합니다. 의견 표시 페이지는 성능 분석에도 사용할 수 있습니다.

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',
    ),
    */
  ),
),

YII의 기본 로그 사용:

다음을 사용할 수 있습니다. YII Yii::log와 Yii::trace는 로그 정보를 출력하기 위해 제공됩니다. 둘 사이의 차이점은 정의를 보면 알 수 있습니다.

함수 정의

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);
}

$msg: 출력하려는 ​​로그 정보

$category: 로그 정보가 속한 카테고리

$level: 로그 정보 레벨:

const LEVEL_TRACE='trace'; 디버깅 환경에서 사용, 프로그램 실행 프로세스 추적
const LEVEL_WARNING='warning'; 경고 메시지
const LEVEL_ERROR='error' ; 치명적인 오류 메시지
const LEVEL_INFO='info'; 일반 프롬프트 정보
const LEVEL_PROFILE='profile'; 성능 디버깅 정보

기본 사용 예

<?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);
  }
}

로그 YII 위치의 출력

위에서 언급한 것처럼 YII의 로그 출력 위치는 여러 위치로 정의될 수 있습니다. 주로 구성 파일 수정을 통해 예를 들어

&#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;,
    ),
  ),
),

은 로그 파일로 출력될 뿐만 아니라 웹 페이지로도 출력됩니다.

구성 파일에서:

routes는 로그 출력 위치를 구성하는 데 사용되며,
class는 로그이고, 로그 경로의 클래스 이름은
levels가 맨 위에 있습니다. 로그 수준, 문자열 시퀀스, 사용 및 분할이 쉽습니다. 특히 CLooger의 상수에 해당합니다

참고:

로그 파일의 저장 위치는:/yii_dev/testwebap/protected/runtime/application.log

소개 공식로그 아주 자세하게 나와있는데 후반부 중국어 번역이 빠져있어서 여기에 번역을 올려서 완성합니다.

Yii는 유연하고 확장 가능한 로깅 기능을 제공합니다. 기록된 로그는 로그 수준 및 정보 분류별로 분류할 수 있습니다. 수준 및 범주 필터를 사용하면 선택한 정보를 파일, 이메일, 브라우저 창 등과 같은 다른 대상으로 추가로 라우팅할 수 있습니다.

1. 정보 기록

Yii::log 또는 Yii::trace를 통해 정보를 기록할 수 있습니다. 차이점은 후자는 애플리케이션이 디버그 모드에서 실행될 때만 정보를 기록한다는 것입니다.

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

정보를 기록할 때 해당 카테고리와 수준을 지정해야 합니다. 카테고리는 경로 별칭과 유사한 형식의 문자열입니다. 예를 들어 메시지가 CController에 기록되면 system.web.CController를 분류로 사용할 수 있습니다. 정보 수준은 다음 값 중 하나여야 합니다.

trace: Yii::trace에서 사용되는 수준입니다. 개발 중에 프로그램의 실행 흐름을 추적하는 데 사용됩니다.
info: 일반적인 정보를 기록하는데 사용됩니다.
프로필: 성과 개요(프로필)입니다. 더 자세한 지침은 곧 이어질 것입니다.
경고: 경고 정보에 사용됩니다.
error: 치명적인 오류 메시지에 사용됩니다.

2. 정보 라우팅

Yii::log 또는 Yii::trace를 통해 기록된 정보는 메모리에 저장됩니다. 일반적으로 브라우저 창에 표시하거나 파일이나 이메일과 같은 영구 저장소에 저장해야 합니다. 이를 메시지 라우팅이라고 합니다. 즉, 메시지를 다른 대상으로 보내는 것입니다.

Yii에서 정보 라우팅은 CLogRouter라는 애플리케이션 구성 요소에 의해 관리됩니다. 로그 라우팅이라는 일련의 작업을 관리하는 역할을 담당합니다. 각 로그 경로는 별도의 로그 대상을 나타냅니다. 로그 경로를 통해 전송된 메시지는 해당 수준 및 카테고리별로 필터링됩니다.

메시지 라우팅을 사용하려면 CLogRouter 애플리케이션 구성 요소를 설치하고 사전 로드해야 합니다. 또한 원하는 로그 경로에 대한 경로 속성을 구성해야 합니다. 아래 코드는 필수 애플리케이션 구성의 예를 보여줍니다.

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;,
        ),
      ),
    ),
  ),
)

위 예에서는 두 개의 로그 경로를 정의했습니다. 첫 번째는 CFileLogRoute로, 애플리케이션의 런타임 디렉터리에 있는 파일에 정보를 저장합니다. 그리고 레벨 추적이나 정보 및 시스템으로 시작하는 카테고리가 있는 정보만 저장됩니다. 두 번째 경로는 CEmailLogRoute로, 지정된 이메일 주소로 정보를 전송하며, 레벨 오류 또는 경고가 있는 메시지만 전송됩니다.

Yii에서는 다음과 같은 로그 경로를 사용할 수 있습니다.

CDbLogRoute: 데이터베이스의 테이블에 정보를 저장합니다.
CEmailLogRoute: 지정된 이메일 주소로 정보를 보냅니다.
CFileLogRoute: 애플리케이션의 런타임 디렉터리에 있는 파일에 정보를 저장합니다.
CWebLogRoute: 현재 페이지 하단에 정보를 표시합니다.
CProfileLogRoute: 페이지 하단에 프로파일링 정보를 표시합니다.

정보: 정보 라우팅은 현재 요청 주기가 끝날 때 onEndRequest 이벤트가 트리거될 때 발생합니다. 현재 요청 프로세스를 명시적으로 종료하려면 die() 또는 exit()를 사용하는 대신 CApplication::end()를 호출합니다. CApplication::end()는 정보가 원활하게 기록되도록 onEndRequest 이벤트를 트리거하기 때문입니다.

3. 정보 필터링

正如我们所提到的,信息可以在他们被发送到一个日志路由之前通过它们的级别和分类过滤。 这是通过设置对应日志路由的 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...
      ),
    ),
  ),
)

从版本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;);

其中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中文网!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.