Yii - Protokollierung

Yii bietet ein hochgradig anpassbares und erweiterbares Framework. Mit Hilfe dieses Frameworks können Sie problemlos verschiedene Arten von Nachrichten protokollieren.

Um eine Nachricht zu protokollieren, sollten Sie eine der folgenden Methoden aufrufen:

  • Yii::error() - Zeichnet eine schwerwiegende Fehlermeldung auf.

  • Yii::warning() - Zeichnet eine Warnmeldung auf.

  • Yii::info() - Zeichnet eine Nachricht mit einigen nützlichen Informationen auf.

  • Yii::trace() - Zeichnet eine Nachricht auf, um zu verfolgen, wie ein Code ausgeführt wird.

Die oben genannten Methoden zeichnen Protokollnachrichten in verschiedenen Kategorien auf. Sie teilen die folgende Funktionssignatur -

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

wo -

  • $message - Die aufzuzeichnende Protokollnachricht

  • $category - Die Kategorie der Protokollnachricht

Eine einfache und bequeme Art, ein Schema zu benennen, ist die Verwendung der magischen Konstante PHP __METHOD__. Zum Beispiel -

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

Ein Protokollziel ist eine Instanz der Klasse yii \ log \ Target. Es filtert alle Protokollnachrichten nach Kategorien und exportiert sie in Dateien, Datenbanken und / oder E-Mails.

Step 1 - Sie können auch mehrere Protokollziele registrieren, z.

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',
               ],
            ],
         ],
      ],
   ],
];

Im obigen Code sind zwei Ziele registriert. Das erste Ziel wählt alle Fehler, Warnungen, Traces und Infomeldungen aus und speichert sie in einer Datenbank. Das zweite Ziel sendet alle Fehler- und Warnmeldungen an die Administrator-E-Mail.

Yii bietet die folgenden integrierten Protokollziele:

  • yii\log\DbTarget - Speichert Protokollnachrichten in einer Datenbank.

  • yii\log\FileTarget - Speichert Protokollnachrichten in Dateien.

  • yii\log\EmailTarget - Sendet Protokollnachrichten an vordefinierte E-Mail-Adressen.

  • yii\log\SyslogTarget - Speichert Protokollnachrichten in Syslog, indem die PHP-Funktion syslog () aufgerufen wird.

Standardmäßig werden Protokollnachrichten wie folgt formatiert:

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

Step 2 - Um dieses Format anzupassen, sollten Sie das konfigurieren yii\log\Target::$prefixEigentum. Zum Beispiel.

[
   '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]";
   }
]

Das obige Codefragment konfiguriert ein Protokollziel so, dass allen Protokollnachrichten die aktuelle Benutzer-ID vorangestellt wird.

Standardmäßig enthalten Protokollnachrichten die Werte dieser globalen PHP-Variablen: $ _GET, $ _POST, $ _SESSION, $ _COOKIE, $ _FILES und $ _SERVER. Um dieses Verhalten zu ändern, sollten Sie das konfigurierenyii\log\Target::$logVars Eigenschaft mit den Namen der Variablen, die Sie einschließen möchten.

Alle Protokollnachrichten werden vom Protokollierungsobjekt in einem Array verwaltet. Das Protokollierungsobjekt hat die aufgezeichneten Nachrichten jedes Mal an die Protokollziele gesendet, wenn das Array eine bestimmte Anzahl von Nachrichten sammelt (Standard ist 1000).

Step 3 - Um diese Nummer anzupassen, sollten Sie die anrufen flushInterval property.

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

Selbst wenn das Logger-Objekt Protokollnachrichten in Protokollziele leert, werden sie nicht sofort exportiert. Der Export erfolgt, wenn ein Protokollziel eine bestimmte Anzahl von Nachrichten sammelt (Standard ist 1000).

Step 4 - Um diese Nummer anzupassen, sollten Sie die konfigurieren exportInterval Eigentum.

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

Step 5 - Ändern Sie nun die config/web.php Datei auf diese Weise.

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

Im obigen Code definieren wir die Protokollanwendungskomponente und setzen die flushInterval und exportIntevalEigenschaften auf 1, sodass alle Protokollnachrichten sofort in den Protokolldateien angezeigt werden. Wir lassen auch die Ebene -Eigenschaft des Protokollziels weg. Dies bedeutet, dass Protokollnachrichten aller Kategorien (Fehler, Warnung, Informationen, Ablaufverfolgung) in den Protokolldateien angezeigt werden.

Step 6 - Erstellen Sie anschließend im SiteController eine Funktion namens actionLog ().

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

Im obigen Code schreiben wir nur vier Protokollnachrichten verschiedener Kategorien in die Protokolldateien.

Step 7 - Geben Sie die URL ein http://localhost:8080/index.php?r=site/login der Adressleiste des Webbrowsers. Protokollnachrichten sollten im Verzeichnis app / runtime / logs in der Datei app.log angezeigt werden.