この記事の例では、laravel でのエラーとログの使用方法について説明します。参考のために皆さんと共有してください。詳細は次のとおりです:
ログ
laravelのログはmonologに基づいてカプセル化されています。 Laravel はそれに対していくつかのことを行いました:
① monolog の addInfo などの関数を info などの関数に簡略化しました
② useFiles と useDailyFiles の 2 つのパラメーターを追加し、ログ管理とカットを容易にしました
③ monolog メソッドを呼び出したい場合、callMonolog 関数を呼び出す必要があります
それでは、次の要件を実装する方法を見てみましょう:
異なるログ情報を異なるログに保存する
この要件は、呼び出しなど、非常に一般的です注文ログは順番に記録される必要があります.logに店舗情報を取得した記録をshop.logに記録する必要があります。これを行うことができます:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?php
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Illuminate\Log\Writer;
class BLogger
{
const LOG_ERROR = 'error';
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().'/logs/'. $type .'.log', $day );
}
$log = self:: $loggers [ $type ];
return $log ;
}
}
|
ログイン後にコピー
このようにして、異なるログ データが異なるログ ファイルに保存されます。ログデータ情報も記録できます。
Laravel のエラーログスタックが長すぎるのですが、どうすればよいですか?
上記の Blogger クラスを使用し、必要なエラー情報を start/global.php に記録します
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | App::error( function (Exception $exception , $code )
{
Log::error( $exception );
$err = [
'message' => $exception ->getMessage(),
'file' => $exception ->getFile(),
'line' => $exception ->getLine(),
'code' => $exception ->getCode(),
'url' => Request::url(),
'input' => Input::all(),
];
BLogger::getLogger(BLogger::LOG_ERROR)->error( $err );
});
|
ログイン後にコピー
Laravel のデフォルトのログはセグメンテーションを使用しません
そのため、laravel のデフォルトのログはデフォルトでセグメンテーションに変更する必要があります。
start/global.phpにもあります
1 | Log::useDailyFiles(storage_path().'/logs/laravel.log', 30);
|
ログイン後にコピー
リクエストのSQLログを記録する方法
これをリアルタイムで記録しますか?
リアルタイム記録が必要ない場合、laravel にはアプリリクエストによって取得された SQL リクエストを取得するための DB::getQueryLog があります:
1 2 3 4 5 6 7 8 9 | ## 在filters.php中
App::after( function ( $request , $response )
{
$queries = DB::getQueryLog();
if (Config::get('query.log', false)) {
BLogger::getLogger('query')->info( $queries );
}
}
|
ログイン後にコピー
リアルタイム記録が必要な場合 (つまり、いつでも死ぬことができます。前のページの SQL リクエストも記録されます)、illuminate.query イベントをリッスンする必要があります
1 2 3 4 5 6 7 8 9 | if (Config::get('database.log', false))
{
Event::listen('illuminate.query', function ( $query , $bindings , $time , $name )
{
$data = compact('query','bindings', 'time', 'name');
BLogger::getLogger(BLogger::LOG_QUERY_REAL_TIME)->info( $data );
});
}
|
ログイン後にコピー
Error
laravel のすべてのエラーは、すべてグローバル App::error を通過しますたとえば、インターフェースを設計していて、エラーが発生した場合でも JSON データを返したい場合は、次のようにすることができます:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | App::error( function (Exception $exception , $code )
{
if ( $exception instanceof NotFoundHttpException) {
return Redirect::route('login');
}
Log::error( $exception );
$err = [
'message' => $exception ->getMessage(),
'file' => $exception ->getFile(),
'line' => $exception ->getLine(),
'code' => $exception ->getCode(),
'url' => Request::url(),
'input' => Input::all(),
];
BLogger::getLogger(BLogger::LOG_ERROR)->error( $err );
$response = [
'status' => 0,
'error' => "服务器内部错误" ,
];
return Response::json( $response );
});
|
ログイン後にコピー
404 エラーも保持したい場合:
1 2 3 4 5 6 7 8 | App::missing( function ( $exception )
{
$response = [
'status' => 0,
'error' => "请求路径错误" ,
];
return Response::json( $response );
});
|
ログイン後にコピー
この記事が、Laravel フレームワークに基づいた PHP プログラミングを行うすべての人に役立つことを願っています。
laravel でのエラーとログの使用方法の詳細な説明については、PHP 中国語 Web サイトに注目してください。