Laravel: Lỗi và Logging


Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên

Giới thiệu

Khi bạn bắt đầu một dự án Laravel mới thì việc xử lý lỗi và xử lý ngoại lệ đã được cấu hình cho bạn. Lớp App\Exceptions\Handler là nơi mà tất cả các trường hợp ngoại lệ được kích hoạt bởi ứng dụng của bạn được đăng nhập và sau đó trả lại cho người sử dụng.

Đối với logging, Laravel sử dụng thư viện Monolog, thư viện này cung cấp các hỗ trợ cho một loạt các xử lý đăng nhập rất mạnh mẽ. Laravel cấu hình một số các xử lý cho bạn, cho phép bạn lựa chọn giữa một tập tin đăng nhập đơn, các tập tin đăng nhập quay vòng, hoặc viết thông tin lỗi để đăng nhập hệ thống.

Cấu hình

Chi tiết lỗi

Tùy chọn debug trong tập tin cấu hình config/app.php sẽ xác định xem có bao nhiêu thông tin về một lỗi thực sự được hiển thị cho người dùng. Theo mặc định, tùy chọn này được thiết lập để tôn trọng các giá trị của biến môi trường APP_DEBUG, nó được lưu trữ trong của tập tin.env.

Đối với việc phát triển cục bộ, bạn nên thiết lập biến môi trường APP_DEBUG thành true. Trong môi trường sản phẩm của bạn thì giá trị này nên luôn luôn là false bởi nếu giá trị này được thiết lập thành true thì bạn có nguy cơ để lộ các giá trị cấu hình nhạy cảm với người dùng cuối của ứng dụng của bạn.

Log Storage

Ở bên ngoài Laravel thì Laravel hỗ trợ ghi thông tin đăng nhập bằng văn bản cho các tập tin singlesyslog errorlog. Để cấu hình cơ chế lưu trữ sử dụng Laravel thì bạn nên thay đổi tùy chọn log trong tập tin cấu hình config/app.php. Ví dụ, nếu bạn muốn sử dụng các tập tin nhật ký hàng ngày thay vì một tập tin duy nhất, bạn nên thiết lập giá trị log trong tập tin cấu hình app thành daily như sau:

'log' => 'daily'

Tối đa hóa các tập tin đăng nhập hàng ngày

Khi sử dụng chế độ đăng nhập daily thì Laravel sẽ chỉ giữ lại các file bản ghi năm ngày theo mặc định. Nếu bạn muốn điều chỉnh điều này thì bạn có thể thêm giá trị cấu hình log_max_files vào tập tin cấu hình app như sau:

'log_max_files' => 30

Các mức độ nghiêm trọng đăng nhập

Khi sử dụng Monolog thì các thông báo đăng nhập có thể có mức độ nghiêm trọng khác nhau. Theo mặc định thì Laravel ghi tất cả các cấp độ đăng nhập để lưu trữ. Tuy nhiên, trong môi trường sản xuất của bạn, bạn có thể cấu hình các mức độ tối thiểu cần đăng nhập bằng cách thêm tùy chọn log_level tới tập tin cấu hình .app.php.

Khi tùy chọn này đã được cấu hình thì Laravel sẽ đăng nhập tất cả các cấp độ lớn hơn hoặc bằng với mức độ nghiêm trọng quy định. Ví dụ, một mặc định log_level của  error sẽ đăng nhập error, critical, và emergency:

'log_level' => env('APP_LOG_LEVEL', 'error'),
 
Monolog nhận mức độ nghiêm trọng sau - từ ít nghiêm trọng đến nghiêm trọng nhất: debuginfonoticewarningerrorcriticalalertemergency.

Cấu hình Monolog tùy chỉnh

Here>>Nếu bạn muốn có quyền kiểm soát hoàn toàn cách Monolog được cấu hình cho các ứng dụng của bạn, bạn có thể sử dụng phương thức configureMonologUsing của ứng dụng. Bạn nên thiết lập một lời gọi đến phương thức này trong tập tin bootstrap/app.php ngay trước khi các biến $app được trả về bởi tập tin:

$app->configureMonologUsing(function($monolog) {
    $monolog->pushHandler(...);
});

return $app;

Bộ xử lý ngoại lệ

Phương thức report()

Tất cả các ngoại lệ đều được xử lý bởi lớp App\Exceptions\Handler. Lớp này có hai phương thức là report và render. Chúng ta sẽ xem xét từng phương pháp này một cách chi tiết. Phương pháp report được sử dụng để đăng nhập ngoại lệ hoặc gửi chúng đến một dịch vụ bên ngoài như Bugsnag hoặc Sentry. Theo mặc định phương thức report đơn giản là truyền ngoại lệ tới lớp cơ sở nơi nó được đăng nhập. Tuy nhiên, bạn có thể tự do đăng nhập ngoại lệ bạn muốn.

Ví dụ, nếu bạn cần phải khai báo các loại khác nhau của các trường hợp ngoại lệ theo các cách khác nhau, bạn có thể sử dụng toán tử so sánh instanceof của PHP:

/**
* Report or log an exception.
*
* This is a great spot to send exceptions to Sentry, Bugsnag, etc.
*
* @param  \Exception  $exception
* @return void
*/

public function report(Exception $exception)
{
    if ($exception instanceof CustomException) {
       //
    }

    return parent::report($exception);
}

Here>>Bỏ qua ngoại lệ theo loại

Các  $dontReport tài sản của các xử lý ngoại lệ có chứa một mảng của các loại ngoại lệ mà sẽ không được đăng nhập. Ví dụ, trường hợp ngoại lệ kết quả từ 404 lỗi, cũng như một số loại lỗi, không được ghi vào file log. Bạn có thể thêm các loại ngoại lệ khác với mảng này khi cần thiết:

/**
 * A list of the exception types that should not be reported.
 *
 * @var array
 */
protected $dontReport = [
    \Illuminate\Auth\AuthenticationException::class,
    \Illuminate\Auth\Access\AuthorizationException::class,
    \Symfony\Component\HttpKernel\Exception\HttpException::class,
    \Illuminate\Database\Eloquent\ModelNotFoundException::class,
    \Illuminate\Validation\ValidationException::class,
];

Render Method

Các  render phương pháp có trách nhiệm chuyển đổi một ngoại lệ cho vào phản hồi HTTP mà phải được gửi lại cho trình duyệt. Theo mặc định, các ngoại lệ được thông qua với các lớp cơ sở đó tạo ra một phản ứng dành cho bạn. Tuy nhiên, bạn có thể tự kiểm tra loại trừ hoặc trả lại phản ứng riêng của bạn:

/**
 * Render an exception into an HTTP response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Exception  $exception
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $exception)
{
    if ($exception instanceof CustomException) {
        return response()->view('errors.custom', [], 500);
    }

    return parent::render($request, $exception);
}

Ngoại lệ HTTP

Một số trường hợp ngoại lệ mô tả mã lỗi HTTP từ máy chủ. Ví dụ, điều này có thể là một "không tìm thấy" error (404), một lỗi "trái phép" (401) hoặc thậm chí là một nhà phát triển tạo ra 500 lỗi. Để tạo ra như một phản ứng từ bất cứ nơi nào trong ứng dụng của bạn, bạn có thể sử dụng các  abort helper:

abort(404);

Các  abort helper sẽ ngay lập tức tăng một ngoại lệ đó sẽ được đưa ra bởi các xử lý ngoại lệ. Tùy chọn, bạn có thể cung cấp các văn bản trả lời:

abort(403, 'Unauthorized action.');

Các trang báo lỗi HTTP tùy chỉnh

Laravel làm cho nó dễ dàng để hiển thị các trang lỗi tùy chỉnh cho mã trạng thái HTTP khác nhau. Ví dụ, nếu bạn muốn tuỳ chỉnh các trang báo lỗi 404 mã trạng thái HTTP, tạo ra một . Tập tin này sẽ được phục vụ trên tất cả 404 lỗi được tạo ra bởi ứng dụng của bạn. Những quan điểm trong thư mục này nên được đặt tên để phù hợp với mã trạng thái HTTP chúng tương ứng. Các   ví dụ đưa ra bởi các   chức năng sẽ được thông qua để xem như là một   biến.resources/views/errors/404.blade.phpHttpExceptionabort$exception

Logging

Laravel cung cấp một lớp trừu tượng đơn giản trên đầu trang của các mạnh  Monolog  thư viện. Theo mặc định, Laravel được cấu hình để tạo ra một tập tin nhật ký cho các ứng dụng của bạn trong các   thư mục. Bạn có thể ghi thông tin vào các bản ghi bằng cách sử dụng  mặt tiền :storage/logsLog 

<?php

namespace App\Http\Controllers;

use App\User;
use Illuminate\Support\Facades\Log;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    /**
     * Show the profile for the given user.
     *
     * @param  int  $id
     * @return Response
     */
    public function showProfile($id)
    {
        Log::info('Showing user profile for user: '.$id);

        return view('user.profile', ['user' => User::findOrFail($id)]);
    }
}

Các logger cung cấp các mức Tám khai thác gỗ được định nghĩa trong  RFC 5424khẩn cấpcảnh báophê phánbáo lỗi , cảnh báothông báothông tin  và  debug .

Log::emergency($message);
Log::alert($message);
Log::critical($message);
Log::error($message);
Log::warning($message);
Log::notice($message);
Log::info($message);
Log::debug($message);

Thông tin theo ngữ cảnh

Một mảng các dữ liệu theo ngữ cảnh cũng có thể được thông qua các phương pháp đăng nhập. Dữ liệu này theo ngữ cảnh sẽ được định dạng và hiển thị với các thông tin đăng nhập:

Log::info('User failed to login.', ['id' => $user->id]);

Truy cập vào các tiềm ẩn Monolog Instance

Monolog có một loạt các xử lý bổ sung mà bạn có thể sử dụng để khai thác gỗ. Nếu cần thiết, bạn có thể truy cập dụ Monolog cơ bản được sử dụng bởi Laravel:

$monolog = Log::getMonolog();
» Tiếp: Cấu hình cơ bản cho Laravel
« Trước: Cách khắc phục lỗi: SQLSTATE[HY000] [1045] Access denied...
Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên
Copied !!!