Heim  >  Artikel  >  Backend-Entwicklung  >  Yii Framework Offizielle Tutorial-Ergänzung 45 – Spezialthema: Protokollierung

Yii Framework Offizielle Tutorial-Ergänzung 45 – Spezialthema: Protokollierung

黄舟
黄舟Original
2017-02-16 09:34:001575Durchsuche



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.


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

Beim Aufzeichnen von Informationen müssen wir deren Kategorie und Ebene angeben. Die Kategorie ist ein ähnliches Format ein Pfad. Eine Zeichenfolge für den Alias. 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:

  • 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: Dies wird zum Aufzeichnen gewöhnlicher Informationen verwendet.

  • Profil: Dies ist die 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 wird als Informationsrouting bezeichnet, beispielsweise das Versenden von Informationen an verschiedene Ziele.

In Yii wird die Informationsweiterleitung durch eine Anwendungskomponente namens CLogRouter verwaltet. Es verwaltet eine Reihe von Dingen, die als Protokollrouten 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: Es sind 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 die Ebene des Fehlers oder der Warnung gesendet wird.

In Yii sind die folgenden Protokollrouten verfügbar:

CDbLogRoute: Informationen in einer Tabelle in der Datenbank speichern.
array(
    ......
    'preload'=>array('log'),
    'components'=>array(
        ......
        'log'=>array(
            'class'=>'CLogRouter',
            'routes'=>array(
                array(
                    'class'=>'CFileLogRoute',
                    'levels'=>'trace, info',
                    'categories'=>'system.*',
                ),
                array(
                    'class'=>'CEmailLogRoute',
                    'levels'=>'error, warning',
                    'emails'=>[email protected]',
                ),
            ),
        ),
    ),
)

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.
  • Informationen:

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

  • Wie bereits erwähnt, können Nachrichten nach Ebene und Kategorie gefiltert werden, bevor sie an einen Protokollrouter gesendet werden. Dies erfolgt durch Festlegen der Ebenen- und Kategorienattribute der entsprechenden Protokollroute. Mehrere Ebenen oder Kategorien sollten durch Kommas verbunden werden.
Da die Informationsklassifizierung dem Format xxx.yyy.zzz ähnelt, können wir sie als Klassifizierungsebene betrachten. Konkret sagen wir, dass xxx das übergeordnete Element von xxx.yyy ist, das wiederum das übergeordnete Element von xxx.yyy.zzz ist. Auf diese Weise können wir xxx.* verwenden, um die Kategorie xxx und alle ihre untergeordneten und Enkelkategorien darzustellen.

4. Kontextinformationen aufzeichnen

Ab Version 1.0.6 können wir die Aufzeichnung zusätzlicher Kontextinformationen, wie z. B. vordefinierte PHP-Variablen (z. B. $_GET, $_SERVER), einrichten ID, Benutzername usw. Dies wird durch die Angabe einer geeigneten Protokollfilterregel im CLogRoute::filter-Attribut einer Protokollroute erreicht.

框架使用非常方面的可以用于大多数日志过滤的CLogFilter,默认情况下, CLogFilter 将会记录一条包含变量(如通常包含系统上下文变量值的如$_GET,$_SERVER等)的信息。CLogFilter还可以用于配置到每一个日志信息之前,带上session ID,用户名等。当我们要查找日志信息的位置时这将带来极大的便利 。

下面的配置展示了如何开启记录上下文信息。每一个日志路由都有自己的日志过滤器,但是默认情况下, 日志路由并不包含日志过滤器。


array(
    ......
    'preload'=>array('log'),
    'components'=>array(
        ......
        'log'=>array(
            'class'=>'CLogRouter',
            'routes'=>array(
                array(
                    'class'=>'CFileLogRoute',
                    'levels'=>'error',
                    'filter'=>'CLogFilter',
                ),
                ...other log routes...
            ),
        ),
    ),
)

从版本1.0.7开始,Yii支持记录通过调用Yii::trace返回的日志记录信息中的回调栈信息。这一特性默认是取消的,因为这回降低性能。想要使用这一特性,只需在入口脚本中定义一个名为YII_TRACE_LEVEL的大于0的常量 (在包含yii.php之前),然后Yii将会在每一个trace信息之后加上应用代码回调栈的文件名和行号。 YII_TRACE_LEVEL 决定了每一个回调栈的层级将会被记录。这个信息在开发期间很有用,因为这可以帮助我们确定触发trace信息的位置。

5. 性能分析

性能分析是一个特殊的日志记录类型。性能分析可以用于衡量指定代码块的运行时间,并且找出性能瓶颈。

使用性能分析,我们需要指定被分析的代码块。我们通过插入如下代码来标记每一个代码块的开始和结束:


Yii::beginProfile('blockID');
...code block being Yii Framework Offizielle Tutorial-Ergänzung 45 – Spezialthema: Protokollierungd...
Yii::endProfile('blockID');

其中blockID 指的是代码块的唯一标志符.

注意, 代码块需要被合理嵌套。也就是说,一个代码块不能和另一代码块交叉嵌套:要么是并行的,要么是完全封闭包含在另一个代码块里。

为了显示分析结果, 需要安装 一个包含CProfileLogRoute日志路由的CLogRouter 应用组件。这和我们处理其他的信息路由一样,CProfileLogRoute路由将会在当前页面的底部显示性能分析结果。

Yii Framework Offizielle Tutorial-Ergänzung 45 – Spezialthema: Protokollierung

6. SQL执行分析

性能分析在处理数据库操作时尤为有用,因为 SQL 执行经常是一个应用主要的性能瓶颈。 我们当然可以在每一次SQL执行的地方插入beginProfile 和 endProfile语句, 从版本1.0.6开始, 但Yii 提供了一个更加系统的方式来解决这个问题。

通过在应用配置中设置 CDbConnection::enableProfiling 为true, 每一个被执行的SQL语句都会被分析. 结果可以通过设置前面提到的CProfileLogRoute来显示, 这样我们就能知晓每一个SQL语句的执行时间。除此之外我们还可以调用CDbConnection::getStats() 来取回SQL语句执行的次数和总的执行时间。

 以上就是Yii框架官方教程增补版45——专题:日志记录的内容,更多相关内容请关注PHP中文网(www.php.cn)!


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