Yii - Journalisation

Yii fournit un cadre hautement personnalisable et extensible. Avec l'aide de ce framework, vous pouvez facilement enregistrer différents types de messages.

Pour consigner un message, vous devez appeler l'une des méthodes suivantes -

  • Yii::error() - Enregistre un message d'erreur fatale.

  • Yii::warning() - Enregistre un message d'avertissement.

  • Yii::info() - Enregistre un message avec des informations utiles.

  • Yii::trace() - Enregistre un message pour suivre le fonctionnement d'un morceau de code.

Les méthodes ci-dessus enregistrent les messages de journal dans différentes catégories. Ils partagent la signature de fonction suivante -

function ($message, $category = 'application')

où -

  • $message - Le message du journal à enregistrer

  • $category - La catégorie du message de journal

Un moyen simple et pratique de nommer un schéma consiste à utiliser la constante magique PHP __METHOD__. Par exemple -

Yii::info('this is a log message', __METHOD__);

Une cible de journal est une instance de la classe yii \ log \ Target. Il filtre tous les messages du journal par catégories et les exporte vers un fichier, une base de données et / ou un courrier électronique.

Step 1 - Vous pouvez également enregistrer plusieurs cibles de journal, comme.

return [
   // the "log" component is loaded during bootstrapping time
   'bootstrap' => ['log'],
   'components' => [
      'log' => [
         'targets' => [
            [
               'class' => 'yii\log\DbTarget',
               'levels' => ['error', 'warning', 'trace', 'info'],
            ],
            [
               'class' => 'yii\log\EmailTarget',
               'levels' => ['error', 'warning'],
               'categories' => ['yii\db\*'],
               'message' => [
                  'from' => ['[email protected]'],
                  'to' => ['[email protected]', '[email protected]'],
                  'subject' => 'Application errors at mydomain.com',
               ],
            ],
         ],
      ],
   ],
];

Dans le code ci-dessus, deux cibles sont enregistrées. La première cible sélectionne toutes les erreurs, avertissements, traces et messages d'information et les enregistre dans une base de données. La deuxième cible envoie tous les messages d'erreur et d'avertissement à l'e-mail de l'administrateur.

Yii fournit les cibles de journal intégrées suivantes -

  • yii\log\DbTarget - Stocke les messages du journal dans une base de données.

  • yii\log\FileTarget - Enregistre les messages du journal dans des fichiers.

  • yii\log\EmailTarget - Envoie les messages du journal à des adresses e-mail prédéfinies.

  • yii\log\SyslogTarget - Enregistre les messages du journal dans syslog en appelant la fonction PHP syslog ().

Par défaut, les messages du journal sont formatés comme suit -

Timestamp [IP address][User ID][Session ID][Severity Level][Category] Message Text

Step 2 - Pour personnaliser ce format, vous devez configurer le yii\log\Target::$prefixpropriété. Par exemple.

[
   'class' => 'yii\log\FileTarget',
   'prefix' => function ($message) {
      $user = Yii::$app->has('user', true) ? Yii::$app->get('user') :
      'undefined user';
      $userID = $user ? $user->getId(false) : 'anonym';
      return "[$userID]";
   }
]

L'extrait de code ci-dessus configure une cible de journal pour préfixer tous les messages de journal avec l'ID utilisateur actuel.

Par défaut, les messages du journal incluent les valeurs de ces variables PHP globales: $ _GET, $ _POST, $ _SESSION, $ _COOKIE, $ _FILES et $ _SERVER. Pour modifier ce comportement, vous devez configurer leyii\log\Target::$logVars propriété avec les noms des variables que vous souhaitez inclure.

Tous les messages du journal sont conservés dans un tableau par l'objet enregistreur. L'objet de journalisation a vidé les messages enregistrés vers les cibles de journal à chaque fois que la matrice accumule un certain nombre de messages (la valeur par défaut est 1000).

Step 3 - Pour personnaliser ce numéro, vous devez appeler le flushInterval property.

return [
   'bootstrap' => ['log'],
   'components' => [
      'log' => [
         'flushInterval' => 50, // default is 1000
         'targets' => [...],
      ],
   ],
];

Même lorsque l'objet de journalisation vide les messages du journal vers les cibles du journal, ils ne sont pas exportés immédiatement. L'exportation se produit lorsqu'une cible de journal accumule un certain nombre de messages (la valeur par défaut est 1000).

Step 4 - Pour personnaliser ce numéro, vous devez configurer le exportInterval propriété.

[
   'class' => 'yii\log\FileTarget',
   'exportInterval' => 50, // default is 1000
]

Step 5 - Maintenant, modifiez le config/web.php classer de cette façon.

<?php
   $params = require(__DIR__ . '/params.php');
   $config = [
      'id' => 'basic',
      'basePath' => dirname(__DIR__),
      'bootstrap' => ['log'],
      'components' => [
         'request' => [
            // !!! insert a secret key in the following (if it is empty) - this
               //is required by cookie validation
            'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',
         ],
         'cache' => [
            'class' => 'yii\caching\FileCache',
         ],
         'user' => [
            'identityClass' => 'app\models\User',
            'enableAutoLogin' => true,
         ],
         'errorHandler' => [
            'errorAction' => 'site/error',
         ],
         'mailer' => [
            'class' => 'yii\swiftmailer\Mailer',
            // send all mails to a file by default. You have to set
            // 'useFileTransport' to false and configure a transport
            // for the mailer to send real emails.
            'useFileTransport' => true,
         ],
         'log' => [
            'flushInterval' => 1,
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
               [
                  'class' => 'yii\log\FileTarget',
                  'exportInterval' => 1,
                  'logVars' => []
               ],
            ],
         ],
         'db' => require(__DIR__ . '/db.php'),
      ],
      'modules' => [
         'hello' => [
            'class' => 'app\modules\hello\Hello',
         ],
      ],
      'params' => $params,
   ];
   if (YII_ENV_DEV) {
      // configuration adjustments for 'dev' environment
      $config['bootstrap'][] = 'debug';
      $config['modules']['debug'] = [
         'class' => 'yii\debug\Module',
      ];
      $config['bootstrap'][] = 'gii';
      $config['modules']['gii'] = [
         'class' => 'yii\gii\Module',
      ];
   }
   return $config;
?>

Dans le code ci-dessus, nous définissons le composant d'application de journal, définissons le flushInterval et exportIntevalproperties à 1 afin que tous les messages du journal apparaissent immédiatement dans les fichiers journaux. Nous omettons également la propriété niveaux de la cible du journal. Cela signifie que les messages du journal de toutes les catégories (erreur, avertissement, info, trace) apparaîtront dans les fichiers journaux.

Step 6 - Ensuite, créez une fonction appelée actionLog () dans le SiteController.

public function actionLog() {
   Yii::trace('trace log message');
   Yii::info('info log message');
   Yii::warning('warning log message');
   Yii::error('error log message');
}

Dans le code ci-dessus, nous écrivons simplement quatre messages de journal de différentes catégories dans les fichiers journaux.

Step 7 - Tapez l'URL http://localhost:8080/index.php?r=site/logdans la barre d'adresse du navigateur Web. Les messages de journal doivent apparaître sous le répertoire app / runtime / logs dans le fichier app.log.