ホームページ >php教程 >PHP开发 >laravelのエラーとログの使い方を詳しく解説

laravelのエラーとログの使い方を詳しく解説

高洛峰
高洛峰オリジナル
2016-12-23 17:21:341398ブラウズ

この記事の例では、laravel でのエラーとログの使用方法について説明します。参考のために皆さんと共有してください。詳細は次のとおりです:

ログ

laravelのログはmonologに基づいてカプセル化されています。 Laravel はそれに対していくつかのことを行いました:

① monolog の addInfo などの関数を info などの関数に簡略化しました

② useFiles と useDailyFiles の 2 つのパラメーターを追加し、ログ管理とカットを容易にしました

③ monolog メソッドを呼び出したい場合、callMonolog 関数を呼び出す必要があります

それでは、次の要件を実装する方法を見てみましょう:

異なるログ情報を異なるログに保存する

この要件は、呼び出しなど、非常に一般的です注文ログは順番に記録される必要があります.logに店舗情報を取得した記録をshop.logに記録する必要があります。これを行うことができます:

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

このようにして、異なるログ データが異なるログ ファイルに保存されます。ログデータ情報も記録できます。

Laravel のエラーログスタックが長すぎるのですが、どうすればよいですか?

上記の Blogger クラスを使用し、必要なエラー情報を 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);
});

Laravel のデフォルトのログはセグメンテーションを使用しません

そのため、laravel のデフォルトのログはデフォルトでセグメンテーションに変更する必要があります。

start/global.phpにもあります

Log::useDailyFiles(storage_path().&#39;/logs/laravel.log&#39;, 30);

リクエストのSQLログを記録する方法

これをリアルタイムで記録しますか?

リアルタイム記録が必要ない場合、laravel にはアプリリクエストによって取得された SQL リクエストを取得するための DB::getQueryLog があります:

## 在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);
  }
}

リアルタイム記録が必要な場合 (つまり、いつでも死ぬことができます。前のページの SQL リクエストも記録されます)、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);
  });
}

Error

laravel のすべてのエラーは、すべてグローバル App::error を通過しますたとえば、インターフェースを設計していて、エラーが発生した場合でも JSON データを返したい場合は、次のようにすることができます:

// 错误日志信息
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);
});

404 エラーも保持したい場合:

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

この記事が、Laravel フレームワークに基づいた PHP プログラミングを行うすべての人に役立つことを願っています。

laravel でのエラーとログの使用方法の詳細な説明については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。