+4

Errors & Logging trong Laravel 5.3

Xin chào các bạn. Hôm nay mình sẽ tiếp tục về series về Laravel. Và hôm nay mình sẽ giới thiệu với các bạn vềErrors & Logging trong laravel và cách sử dụng .

Errors & Logging

Giới thiệu

Khi bạn bắt đầu một project Laravel mới, việc xử lý error và exception đã được cấu hình sẵn cho bạn. Thêm vào đó, Laravel được tích hợp với thư viện Monolog, đây là thư viện hỗ trợ các xử lý log rất hữu hiệu.

Cấu hình

Chi tiết Error

Các nội dung chi tiết lỗi trong ứng dụng của bạn hiển thị trên trình duyệt được điều khiển bởi cấu hình debug trong file cấu hình config/app.php. Mặc định, cấu hình này thiết lập dựa trên giá trị biến môi trường APP_DEBUG, lưu trong file .env.

Trong môi trường phát triển nội bộ, bạn nên set giá trị APP_DEBUG thành true. Trong môi trường production, giá trị này luôn luôn phải là false.

Các chế độ log

Cơ bản, Laravel hỗ trợ các chế độ log này single, daily, syslog, và errorlog. Ví dụ, nếu bạn muốn ghi log file hàng ngày, thay vì ghi vào một file, bạn đơn giản chỉ cần thiết lập giá trị log trong file config/app.php:

'log' => 'daily'

Khi sử dụng chế độ daily, Laravel sẽ chỉ lưu trữ log files của 5 ngày. Nếu bạn muốn điều chỉnh số lượng file lưu trữ, bạn có thể thêm vào cấu hình log_max_files vào trong app.php:

'log_max_files' => 30

Tuỳ chọn cấu hình Monolog

Nếu bạn muốn điều khiển toàn bộ quy trình Monolog cấu hình trên ứng dụng, bạn có thể sử dụng phương thức configureMonologUsing. Bạn nên gọi xử lý này trong file bootstrap/app.php ngay trước khi biến $app được trả về:

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

return $app;

The Exception Handler

Tất cả các exception được xử lý bởi App\Exception\Handler class. Class này chứa hai phương thức: reportrender. Chúng ta sẽ tìm hiểu các phương thức này.

Phương thức Report

Phương thức report được sử dụng để log các exception hoặc gửi chúng tới các dịch vụ bên ngoài như BugSnag hay Sentry. Mặc định, report đơn giản chỉ đẩy exception về class cơ sở nơi mà exception được log lại. Tuy nhiên, bạn có thể tuỳ ý log exception theo cách bạn muốn.

Ví dụ, nếu bạn cần report nhiều kiểu exception bằng nhiều cách khác nhau, bạn có thể sử dụng toán tử kiểm tra instanceof của PHP:

/**
 * Report or log an exception.
 *
 * This is a great spot to send exceptions to Sentry, Bugsnag, etc.
 *
 * @param  \Exception  $e
 * @return void
 */
public function report(Exception $e)
{
    if ($e instanceof CustomException) {
        //
    }

    return parent::report($e);
}

Loại bỏ exception theo kiểu

Thuộc tính $dontReport của handler xử lý exception chứa một mảng các kiểu exception sẽ không cần log. Mặc định, exception của lỗi 404 sẽ không được lưu vào trong log file. Bạn có thể thêm các kiểu exception vào trong mảng này nếu thấy cần thiết.

Phương thức Render

Phương thức render chịu trách nhiệm chuyển đổi một exception thành một mẫu HTTP response để trả lại cho trình duyệt. Mặc định, exception được đẩy tới class cơ sở để tạo response cho bạn. Tuy nhiên, bạn hoàn toàn tự do trong việc kiểm tra kiểu exception hoặc trả về response tuỳ ý riêng của bạn:

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

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

HTTP Exceptions

Một số exception mô tả mã lỗi HTTP từ server. Ví dụ, đó có thể là một lỗi "page not found" (404), một lỗi "unauthorized error" (401) hoặc lỗi 500. Để sinh ra response cho mã lỗi tại bất kì vị trí trên ứng dụng, sử dụng:

abort(404);

Phương thức abort sẽ lập tức đẩy ra một exception sẽ được render bởi exception handler. Bạn có thể tuỳ chọn cung cấp thêm nội dung response:

abort(403, 'Unauthorized action.');

Phương thức này có thể được sử dụng bất cứ lúc nào trong lifecycle của request.

Tuỳ biến HTTP Error Pages

Laravel làm cho việc trả về trang lỗi tuỳ chọn cho các mã lỗi HTTP một cách dễ dàng. Ví dụ, nếu bạn muốn chỉnh sửa trang lỗi riêng cho trang HTTP 404, tạo một file resources/views/errors/404.blade.php. File này sẽ được gọi ra khi có lỗi 404 được sinh ra trong ứng dụng của bạn.

Các views nằm trong thư mục này nên được đặt tên trùng với mã lỗi HTTP tương ứng.

Logging

Công cụ log của Laravel cung cấp một layer đơn giản dựa trên thư viện Monolog. Mặc định, Laravel được cấu hình để tạo log file cho ứng dụng trong thư mục storage/logs. Bạn có thể viết thêm nội dung vào trong logs sử dụng Log facade:

<?php

namespace App\Http\Controllers;

use Log;
use App\User;
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 cung cấp 8 level log cơ bản theo định nghĩa của RFC 5424: emergency, alert, critical, error, warning, notice, info and debug.

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

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 truyền vào phương thức log. Các dữ liệu này sẽ được format 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 của Monolog

Monolog có một số handler bổ sung mà bạn có thể sử dụng cho việc log. Nếu cần thiết, bạn có thể truy cập vào instance phía dưới của Monolog mà đang được dùng bởi Laravel:

$monolog = Log::getMonolog();

 ##

Như vậy mình đã giới thiệu cho các bạn khá là chi tiết về Errors & Logging trong laravel. Mọi thắc mắc cần giải đáp hãy để lại comment ở phía dưới nhé! Tham Khảo https://laravel.com/docs/5.4


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.