Maison > php教程 > PHP开发 > le corps du texte

Explication détaillée de l'erreur et de l'utilisation du journal dans Laravel

高洛峰
Libérer: 2016-12-23 17:21:34
original
1374 Les gens l'ont consulté

Les exemples de cet article décrivent l'utilisation des erreurs et des journaux dans Laravel. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

Journal

La connexion dans Laravel est encapsulée sur la base d'un monologue. Laravel a fait plusieurs choses dessus :

① Fonctions simplifiées telles que addInfo dans le monologue en fonctions comme info

② Ajout de deux paramètres, useFiles et useDailyFiles, pour activer la journalisation. La gestion et la découpe sont devenues plus faciles

③ Si vous souhaitez appeler la méthode monologue, vous devez appeler la fonction callMonolog

D'accord, voyons comment implémenter les exigences suivantes :

sera différent Le les informations du journal sont stockées dans différents journaux

Cette exigence est très courante. Par exemple, le journal des commandes d'appel doit être enregistré dans order.log et l'enregistrement de l'obtention des informations sur le magasin doit être enregistré dans la boutique. enregistrer. Vous pouvez faire ceci :

<?php
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Illuminate\Log\Writer;
class BLogger
{
  // 所有的LOG都要求在这里注册
  const LOG_ERROR = &#39;error&#39;;
  private static $loggers = array();
  // 获取一个实例
  public static function getLogger($type = self::LOG_ERROR, $day = 30)
  {
    if (empty(self::$loggers[$type])) {
      self::$loggers[$type] = new Writer(new Logger($type));
      self::$loggers[$type]->useDailyFiles(storage_path().&#39;/logs/&#39;. $type .&#39;.log&#39;, $day);
    }
    $log = self::$loggers[$type];
    return $log;
  }
}
Copier après la connexion

De cette façon, différentes données de journal seront stockées dans différents fichiers journaux. Les informations sur les données du journal peuvent également être enregistrées.

La pile du journal des erreurs de Laravel est trop longue, que dois-je faire ?

Utilisez la classe Blogger ci-dessus pour enregistrer les informations d'erreur nécessaires dans start/global.php

// 错误日志信息
App::error(function(Exception $exception, $code)
{
  Log::error($exception);
  $err = [
    &#39;message&#39; => $exception->getMessage(),
    &#39;file&#39; => $exception->getFile(),
    &#39;line&#39; => $exception->getLine(),
    &#39;code&#39; => $exception->getCode(),
    &#39;url&#39; => Request::url(),
    &#39;input&#39; => Input::all(),
  ];
  BLogger::getLogger(BLogger::LOG_ERROR)->error($err);
});
Copier après la connexion

Le journal par défaut de Laravel n'existe pas Utilisez le fractionnement

pour que la journalisation par défaut de Laravel soit modifiée en fractionnement par défaut.

Également dans start/global.php

Log::useDailyFiles(storage_path().&#39;/logs/laravel.log&#39;, 30);
Copier après la connexion

Comment enregistrer le journal SQL d'une requête

Ceci devrait Pour demander plus attentivement, souhaitez-vous enregistrer en temps réel ?

Si vous ne souhaitez pas d'enregistrement en temps réel, alors laravel a DB::getQueryLog pour obtenir la requête SQL obtenue par une requête d'application :

## 在filters.php中
App::after(function($request, $response)
{
  // 数据库查询进行日志
  $queries = DB::getQueryLog();
  if (Config::get(&#39;query.log&#39;, false)) {
    BLogger::getLogger(&#39;query&#39;)->info($queries);
  }
}
Copier après la connexion

Si vous avez besoin d'enregistrer en temps réel (c'est-à-dire que lorsque vous mourez n'importe où, la requête SQL de la page précédente est également enregistrée), vous devez écouter l'événement illuminate.query

// 数据库实时请求的日志
if (Config::get(&#39;database.log&#39;, false))
{
  Event::listen(&#39;illuminate.query&#39;, function($query, $bindings, $time, $name)
  {
    $data = compact(&#39;query&#39;,&#39;bindings&#39;, &#39;time&#39;, &#39;name&#39;);
    BLogger::getLogger(BLogger::LOG_QUERY_REAL_TIME)->info($data);
  });
}
Copier après la connexion

Erreur

Toutes les erreurs dans Laravel passeront par l'erreur globale App::error puis réapparaîtront

Donc par exemple, si vous concevez une interface, j'espère que même s'il y en a Si une erreur se produit et que des données json sont renvoyées, vous pouvez le faire :

// 错误日志信息
App::error(function(Exception $exception, $code)
{
  // 如果没有路径就直接跳转到登录页面
  if ($exception instanceof NotFoundHttpException) {
    return Redirect::route(&#39;login&#39;);
  }
  Log::error($exception);
  $err = [
    &#39;message&#39; => $exception->getMessage(),
    &#39;file&#39; => $exception->getFile(),
    &#39;line&#39; => $exception->getLine(),
    &#39;code&#39; => $exception->getCode(),
    &#39;url&#39; => Request::url(),
    &#39;input&#39; => Input::all(),
  ];
  BLogger::getLogger(BLogger::LOG_ERROR)->error($err);
  $response = [
    &#39;status&#39; => 0,
    &#39;error&#39; => "服务器内部错误",
  ];
  return Response::json($response);
});
Copier après la connexion

Si vous Je souhaite également conserver l'erreur 404 :

App::missing(function($exception)
{
  $response = [
    &#39;status&#39; => 0,
    &#39;error&#39; => "请求路径错误",
  ];
  return Response::json($response);
});
Copier après la connexion

J'espère que cet article sera utile à la conception de programmes PHP de chacun basé sur le framework Laravel.

Pour des explications plus détaillées sur les erreurs et l'utilisation des journaux dans Laravel, veuillez faire attention au site Web PHP chinois !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal