Laravel: Lỗi và Logging
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 single
, syslog
và 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:debug
,info
,notice
,warning
,error
,critical
,alert
,emergency
.
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.php
HttpException
abort
$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/logs
Log
<?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 5424 : khẩn cấp , cảnh báo , phê phán , báo lỗi , cảnh báo , thông báo , thô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();