Maison  >  Article  >  développement back-end  >  Supplément 45 du didacticiel officiel Yii Framework - Sujet spécial : journalisation

Supplément 45 du didacticiel officiel Yii Framework - Sujet spécial : journalisation

黄舟
黄舟original
2017-02-16 09:34:001632parcourir



Yii fournit une fonction de journalisation flexible et évolutive. Les journaux enregistrés peuvent être classés par niveau de journal et classification des informations. En utilisant des filtres de niveau et de catégorie, les informations sélectionnées peuvent être acheminées vers différentes destinations, telles qu'un fichier, un e-mail, une fenêtre de navigateur, etc.

1. Enregistrement des informations

Les informations peuvent être enregistrées via Yii::log ou Yii::trace. La différence est que ce dernier n'enregistre les informations que lorsque l'application s'exécute en mode débogage.


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

Lors de l'enregistrement des informations, nous devons spécifier sa catégorie et son niveau. La catégorie est un format similaire à. un chemin. Une chaîne pour l'alias. Par exemple, si un message est enregistré dans CController, nous pouvons utiliser system.web.CController comme classification. Le niveau d'information doit être l'une des valeurs suivantes :

  • trace : Il s'agit du niveau utilisé dans Yii::trace. Il est utilisé pour suivre le flux d’exécution d’un programme pendant le développement.

  • info : Ceci est utilisé pour enregistrer des informations ordinaires.

  • profil : Ceci est l'aperçu des performances (profil). Des instructions plus détaillées suivront sous peu.

  • avertissement : ceci est utilisé pour les informations d'avertissement.

  • erreur : ceci est utilisé pour les messages d'erreur fatales.

2. Routage des informations

Les informations enregistrées via Yii::log ou Yii::trace sont stockées en mémoire. Nous devons généralement les afficher dans une fenêtre de navigateur ou les enregistrer dans un stockage persistant tel qu'un fichier ou un courrier électronique. C'est ce qu'on appelle le routage d'informations, par exemple l'envoi d'informations vers différentes destinations.

Dans Yii, le routage des informations est géré par un composant applicatif appelé CLogRouter. Il gère une série de choses appelées routes de journaux. Chaque route de journal représente une destination de journal distincte. Les messages envoyés via une route de journaux sont filtrés par leur niveau et leur catégorie.

Pour utiliser le routage des messages, nous devons installer et précharger un composant applicatif CLogRouter. Nous devons également configurer son attribut routes pour les routes de journaux souhaitées. Le code suivant illustre un exemple de configuration d'application requise : Deux routes de journaux sont définies. Le premier est CFileLogRoute, qui enregistre les informations dans un fichier situé dans le répertoire d'exécution de l'application. Et seules les informations avec trace de niveau ou informations et catégories commençant par système seront enregistrées. La deuxième route est CEmailLogRoute, qui enverra des informations à l'adresse e-mail spécifiée, et seul le niveau d'erreur ou d'avertissement sera envoyé.

Dans Yii, les routes de journaux suivantes sont disponibles :

CDbLogRoute : enregistre les informations dans une table de la base de données.
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 : envoyer des informations à l'adresse e-mail spécifiée.

    CFileLogRoute : enregistre les informations dans un fichier dans le répertoire d'exécution de l'application.
  • CWebLogRoute : Afficher les informations en bas de la page actuelle.
  • CProfileLogRoute : affiche les informations de profilage en bas de la page.
  • Informations :

    Le routage des informations se produit lorsque le dernier événement onEndRequest du cycle de requête en cours est déclenché. Pour terminer explicitement le processus de requête en cours, veuillez appeler CApplication::end() au lieu d'utiliser die() ou exit(), car CApplication::end() déclenchera l'événement onEndRequest afin que les informations soient enregistrées sans problème.
  • 3. Filtrage des messages

  • Comme nous l'avons mentionné, les messages peuvent être filtrés par leur niveau et leur catégorie avant d'être envoyés à un routeur de journaux. Cela se fait en définissant les attributs de niveaux et de catégories de la route de journalisation correspondante. Plusieurs niveaux ou catégories doivent être reliés par des virgules.
Étant donné que la classification des informations est similaire au format xxx.yyy.zzz, nous pouvons la considérer comme un niveau de classification. Plus précisément, nous disons que xxx est le parent de xxx.yyy, qui à son tour est le parent de xxx.yyy.zzz. De cette façon, nous pouvons utiliser xxx.* pour représenter la catégorie xxx et toutes ses catégories enfants et petits-enfants.

4. Enregistrer les informations de contexte

À partir de la version 1.0.6, nous pouvons configurer l'enregistrement d'informations de contexte supplémentaires, telles que les variables prédéfinies PHP (telles que $_GET, $_SERVER), la session. ID, nom d'utilisateur, etc. Ceci est accompli en spécifiant une règle de filtrage des journaux appropriée dans l'attribut CLogRoute::filter d'une route de journaux.

框架使用非常方面的可以用于大多数日志过滤的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 Supplément 45 du didacticiel officiel Yii Framework - Sujet spécial : journalisationd...
Yii::endProfile('blockID');

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

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

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

Supplément 45 du didacticiel officiel Yii Framework - Sujet spécial : journalisation

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)!


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn