Xử Lý Errors Và Logging Trong Laravel

Xử Lý Errors Và Logging Trong Laravel
Sử dụng log file hữu ích khi xem nguồn dữ liệu hoạt động như thế nào và các bạn cũng dễ dàng debug hơn.

Khi bắt đầu một dự án mới, chuyện xử lý error và exception đã được cấu hình. Class App\Exceptions\Handler là nơi chứa tất cả trigger ứng dụng của các bạn đang đăng nhập và trả lại cho người dùng. Đối với logging, Laravel tích hợp thư viện Monolog và nó cung cấp một loạt các vấn đề mượt mà. Hệ thống Laravel cấu hình một số vấn đề cho các bạn. Nó cũng cho phép các bạn giữ một hoặc nhiều file log và viết thông tin error vào hệ thống log. 

 

Cấu hình 

 

Chi tiết errors 

 

Khi các bạn chọn debug bên trong config/app.php, nó cho phép thể hiện thông tin về error hiển thị cho người dùng. Cấu hình này mặc định đã thiết lập dựa trên biến môi trường APPDEBUG và thường được lưu trong file .env. Trong môi trường nội địa, các bạn nên đặt giá trị biến APPDEBUG thành true. Đối với môi trường production, giá trị này phải luôn thể hiện là false. Nếu giá trị lại thể hiện là true ở trong môi trường đó, người dùng sẽ thấy các giá trị cấu hình ứng dụng của các bạn. 

 

Lưu trữ log 

 

Laravel hỗ trợ các chế độ file đơn, file hàng ngày, the syslog và errorlog. Để cấu hình cơ chế lưu trữ log, các bạn có thể sửa log trong file config/app.php. Nếu bạn muốn sử dụng log file hàng ngày (thay vì log một file), thì bạn đặt log trong file app thành hàng ngày như trong ví dụ dưới đây: 

 

'log' => 'daily'

 

Giới hạn thời gian file Daily Log

 

Khi sử dụng chế độ daily log, Laravel mặc định để lại file log 5 ngày gần nhất. Nếu muốn điều chỉnh số ngày, các bạn thêm một dòng logmaxfiles vào bên trong file app. 

 

log_max_files' => 30

 

Các mức độ của Log 

 

Khi sử dụng Monolog, nội dung tin nhắn log có nhiều cấp độ khác nhau. Laravel thể hiện tất cả cấp độ log lưu trữ. Trong môi trường production, chúng ta có thể giới hạn cấp độ bằng cách thêm log_level trong file app.php. Khi đã cấu hình được tùy biến, Laravel sẽ tự động log toàn bộ các cấp độ cao hơn hoặc bằng cấp độ tùy biến. Ví dụ mặc định log_level của error sẽ log nội dung error. 

 

'log_level' => env('APP_LOG_LEVEL', 'error'),

 

Tùy biến cấu hình Monolog

 

Nếu muốn điều chỉnh tất cả quy trình Monolog trong ứng dụng, thì các bạn có thể sử dụng phương thức configureMonologUsing method. Tốt nhất là bạn nên gọi phương thức xử lý đó trong file bootstrap/app.php trước biến $app được trả về. 

 

$app->configureMonologUsing(function($monolog) {

    $monolog->pushHandler(...);

});

return $app;

 

Trình xử lý ngoại lệ 

 

Phương thức report

 

Tất cả exception được xử lý từ class App\Exceptions\Handler. Class này chứa đủ hai phương thức render và report. Phương thức report dùng để log các exception hoặc gửi đến các dịch vụ bên ngoài như Bugsnag hoặc Sentry. Nó đẩy các exception về class – nơi mà exception được log lại. Tuy nhiên, bạn có thể tùy biến. Ví dụ nếu cần report nhiều kiểu exception theo nhiều cách khác nhau, thì bạn dùng toán tử kiểm tra của PHP instanceof. 

 

public function report(Exception $exception)

{

    if ($exception instanceof CustomException) {

        //

    }

    return parent::report($exception);

}

 

Loại bỏ exception theo kiểu

 

Thuộc tính $dontReport của handler thường chứa một mảng các kiểu exception và nó sẽ không cần log. Ví dụ exceptions của lỗi 404 và một số lỗi khác sẽ không được lưu vào file log. Bạn có thể thêm kiểu exception khác vào trong mảng nếu thấy cần. 

 

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,

];

 

Phương thức render 

 

Phương thức render chuyển đổi một exception thành một HTTP response để trả lại cho trình duyệt. Exception mặc định được đẩy tới class cơ sở để tạo một response. Tuy nhiên, các bạn có thể thoải mái kiểm tra kiểu exception và trả về response tùy biến theo ý. 

 

public function render($request, Exception $exception)

{

    if ($exception instanceof CustomException) {

        return response()->view('errors.custom', [], 500);

    }

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

}

 

HTTP Exceptions 

 

Một số exceptions sẽ mô tả mã HTTP từ server. Đó có thể là lỗi page not found (404), lỗi unauthorized error (401), lỗi 500,…Để tạo ra response tương ứng với mã lỗi ở bất cứ đâu trong ứng dụng, bạn sử dụng phương thức abort. 

 

abort(404);

 

Phương thức abort khi đó sẽ cho ra một exception và được render từ exception handler. Bạn có thể chọn cung cấp thêm nội dung response. 

 

abort(403, 'Unauthorized action.');

 

Tùy biến HTTP Error Pages

 

Hệ thống Laravel trả về trang lỗi tùy biến tương thích với mã HTTP rất dễ. Ví dụ nếu bạn sửa trang lỗi tương ứng với mã 404 HTTP, thì bạn chỉ cần tạo một file resources/views/errors/404.blade.php. File đó sẽ được gọi ra khi có lỗi 404 HTTP trong ứng dụng của bạn. Các view ở trong thư mục phải khớp với mã lỗi HTTP. HTTP Exception có hàm abort sẽ được hiểu là một biến $exception. 

 

Logging 

 

Laravel thường sẽ cung cấp một lớp abstract đơn giản ở thư viện Monolog. Nó có thể tạo thành file log cho ứng dụng ngay trong thư mục storage/logs. Bạn có thể thêm nội dung trong logs có sử dụng Log façade. 

 

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

    }

}

 

Logger có 8 cấp độ cơ bản theo định nghĩa RFC 5424:

 

  • Khẩn cấp
  • Quan trọng
  • Lỗi
  • Cảnh báo
  • Lưu ý
  • Thông tin (của…)
  • 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 đi theo ngữ cảnh 

 

Một mảng dữ liệu theo ngữ cảnh có thể truyền vào trong phương thức Log. Các dữ liệu sẽ được định dạng và hiển thị cùng với nội dung log. 

 

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

 

Truy cập vào đối tượng phía dưới Monolog

 

Monolog cung cấp một số hander bổ sung mà bạn có thể sử dụng cho việc log. Bạn có thể truy cập vào đối tượng phía dưới của Monolog. 

 

$monolog = Log::getMonolog();

Hồ Hữu Hiền

Mình là developer nên đôi khi viết bài không hay lắm mong các bạn thông cảm. Nếu muốn biết thêm thông tin về mình thì vui lòng vào website này để biết. https://huuhienqt.dev/

Bình luận (0)