Heim  >  Artikel  >  php教程  >  Ausführliche Erläuterung der Protokollnutzung im YII Framework-Tutorial

Ausführliche Erläuterung der Protokollnutzung im YII Framework-Tutorial

高洛峰
高洛峰Original
2016-12-27 14:11:421277Durchsuche

Das Beispiel in diesem Artikel beschreibt die Verwendung des YII Framework-Framework-Protokolls. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:

Die Rolle von Protokollen (1000 Wörter werden hier weggelassen)

Die Protokolle in YII sind sehr gut und leistungsstark, sodass Sie dies tun können Speichern Sie Protokollinformationen in der Datenbank. Senden Sie sie an die angegebene E-Mail und speichern Sie sie in einer Datei. Die Meinungsanzeigeseite kann sogar zur Leistungsanalyse verwendet werden.

Grundlegende Konfiguration von Protokollen 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',
    ),
    */
  ),
),

Grundlegende Verwendung von Protokollen in YII:

Sie können verwenden YII Yii::log und Yii::trace werden zur Ausgabe von Protokollinformationen bereitgestellt. Der Unterschied zwischen den beiden kann anhand der Definition erkannt werden.

Funktionsdefinition

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: die Protokollinformationen, die Sie ausgeben möchten

$category: die Kategorie, zu der die Protokollinformationen gehören

$level: Protokollinformationsebene:

const LEVEL_TRACE='trace'; wird in der Debugging-Umgebung verwendet, um den Programmausführungsprozess zu verfolgen
const LEVEL_WARNING='warning'; ; schwerwiegende Fehlermeldung
const LEVEL_INFO='info'; normale Eingabeaufforderungsinformationen

Beispiele für die grundlegende Verwendung

Protokoll Ausgabeort in YII
<?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);
  }
}

Wie oben erwähnt, kann der Ausgabeort von Protokollen in YII als viele Orte definiert werden. Hauptsächlich durch Änderung der Konfigurationsdatei, zum Beispiel:

wird nicht nur in die Protokolldatei, sondern auch auf die Webseite ausgegeben.
&#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;,
    ),
  ),
),

In der Konfigurationsdatei:

Routen wird verwendet, um den Speicherort der Protokollausgabe zu konfigurieren,

Klasse ist das Protokoll, der Klassenname der Protokollroute

Ebenen ist die oberste Ebene Ebene des Protokolls, eine String-Sequenz, einfach zu verwenden und zu teilen. Entspricht insbesondere den Konstanten in CLooger

Hinweis:

Der Speicherort der Protokolldatei ist:/yii_dev/testwebap/protected/runtime/application.log

Eingeführt von das offizielle Protokoll Es ist sehr detailliert, aber die chinesische Übersetzung der zweiten Hälfte fehlt, daher hier die Übersetzung, um sie zu vervollständigen.

Yii bietet eine flexible und skalierbare Protokollierungsfunktion. Aufgezeichnete Protokolle können nach Protokollebene und Informationsklassifizierung klassifiziert werden. Durch die Verwendung von Ebenen- und Kategoriefiltern können ausgewählte Informationen weiter an verschiedene Ziele weitergeleitet werden, beispielsweise an eine Datei, eine E-Mail, ein Browserfenster usw.

1. Informationsaufzeichnung

Informationen können über Yii::log oder Yii::trace aufgezeichnet werden. Der Unterschied besteht darin, dass Letzteres nur dann Informationen protokolliert, wenn die Anwendung im Debug-Modus ausgeführt wird.

Beim Aufzeichnen von Informationen müssen wir deren Kategorie und Ebene angeben. Kategorie ist eine Zeichenfolge mit einem Format ähnlich dem Pfadalias. Wenn beispielsweise eine Nachricht in CController aufgezeichnet wird, können wir system.web.CController als Klassifizierung verwenden. Die Informationsebene sollte einer der folgenden Werte sein:
Yii::log($message, $level, $category);
Yii::trace($message, $category);

trace: Dies ist die Ebene, die in Yii::trace verwendet wird. Es wird verwendet, um den Ausführungsfluss eines Programms während der Entwicklung zu verfolgen.

Info: Hiermit werden allgemeine Informationen erfasst.

Profil: Dies ist eine Leistungsübersicht (Profil). Genauere Anweisungen folgen in Kürze.
Warnung: Dies wird für Warninformationen verwendet.
Fehler: Dies wird für schwerwiegende Fehlermeldungen verwendet.

2. Informationsweiterleitung

Die über Yii::log oder Yii::trace aufgezeichneten Informationen werden im Speicher gespeichert. Normalerweise müssen wir sie in einem Browserfenster anzeigen oder in einem dauerhaften Speicher wie einer Datei oder E-Mail speichern. Dies nennt man Message Routing, also das Versenden von Nachrichten an verschiedene Ziele.

In Yii wird die Informationsweiterleitung durch eine Anwendungskomponente namens CLogRouter verwaltet. Es ist für die Verwaltung einer Reihe von Dingen verantwortlich, die als Protokollrouting bezeichnet werden. Jede Protokollroute stellt ein separates Protokollziel dar. Über eine Protokollroute gesendete Nachrichten werden nach Ebene und Kategorie gefiltert.

Um das Nachrichtenrouting zu nutzen, müssen wir eine CLogRouter-Anwendungskomponente installieren und vorab laden. Wir müssen auch das Routenattribut für die gewünschten Protokollrouten konfigurieren. Der folgende Code zeigt ein Beispiel für die erforderliche Anwendungskonfiguration:

Im obigen Beispiel haben wir zwei Protokollrouten definiert. Die erste ist CFileLogRoute, die die Informationen in einer Datei im Laufzeitverzeichnis der Anwendung speichert. Und es werden nur Informationen mit Level-Trace oder Informationen und Kategorien gespeichert, die mit System beginnen. Die zweite Route ist CEmailLogRoute, die Informationen an die angegebene E-Mail-Adresse sendet und nur Nachrichten mit der Ebene Fehler oder Warnung gesendet werden.
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;,
        ),
      ),
    ),
  ),
)

In Yii sind die folgenden Protokollrouten verfügbar:

CDbLogRoute: Informationen in einer Tabelle in der Datenbank speichern.

CEmailLogRoute: Informationen an die angegebene E-Mail-Adresse senden.

CFileLogRoute: Informationen in einer Datei im Laufzeitverzeichnis der Anwendung speichern.
CWebLogRoute: Informationen unten auf der aktuellen Seite anzeigen.
CProfileLogRoute: Profilierungsinformationen unten auf der Seite anzeigen.

Information: Die Informationsweiterleitung erfolgt, wenn das onEndRequest-Ereignis am Ende des aktuellen Anforderungszyklus ausgelöst wird. Um den aktuellen Anforderungsprozess explizit zu beenden, rufen Sie CApplication::end() auf, anstatt die() oder exit() zu verwenden, da CApplication::end() das Ereignis onEndRequest auslöst, sodass die Informationen reibungslos protokolliert werden.

3. Informationsfilterung

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

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn