Table of Contents9 sections
Trong quá trình phát triển dự án Laravel, việc kiểm soát lỗi và theo dõi hành vi của hệ thống (Observability) là chìa khóa để giữ cho mã nguồn luôn ổn định. Tuy nhiên, nếu chỉ dừng lại ở việc gọi hàm dd() hay Log::info() cơ bản, bạn đang bỏ phí rất nhiều công cụ mạnh mẽ mà Laravel cung cấp sẵn.
Dưới đây là tổng hợp các mẹo (tips) nâng cao từ Laravel Daily giúp bạn tối ưu hóa quy trình Log và Debug của mình.
1. Nâng tầm Logging trong Laravel
Đồng bộ Log với Log::withContext()
Khi hệ thống có hàng ngàn request chạy đồng thời, các dòng log trong file laravel.log sẽ bị trộn lẫn vào nhau. Để phân biệt log của request này với request khác, bạn có thể thiết lập context chung ngay từ tầng Middleware. Tất cả các lệnh gọi Log::... sau đó trong cùng request đó sẽ tự động được dán kèm nhãn thông tin này.
PHP
// Tạo một Middleware toàn cục để gán Context
public function handle($request, Closure $next)
{
Log::withContext([
'request_id' => (string) Str::uuid(),
'user_id' => auth()->id(),
]);
return $next($request);
}
2. Giám sát hiệu năng Database và những câu lệnh "Chạy chậm"
Bắt gáy các câu Query "rùa bò" (Long Running Queries)
Thay vì phải cài các package nặng nề trên môi trường Production, bạn có thể cấu hình để Laravel tự động ghi log cảnh báo khi phát hiện có bất kỳ câu lệnh SQL nào chạy lâu hơn một khoảng thời gian quy định (ví dụ: quá 1 giây).
PHP
// Viết trong AppServiceProvider.php
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
public function boot()
{
DB::enableQueryLog();
// Cảnh báo nếu câu query chạy lâu hơn 1000 mili-giây
DB::whenQueryingForLongerThan(1000, function ($connection) {
Log::warning('Phát hiện câu truy vấn chạy chậm:', $connection->getQueryLog());
});
}
Xuất nhanh mã SQL của Eloquent ra màn hình
Để kiểm tra xem Eloquent Model đang dịch ra câu lệnh SQL như thế nào mà không cần chạy nó, bạn có thể dùng hàm toSql() hoặc hàm ddRawSql() để nhìn thấy trực tiếp các tham số đã được bind vào chuỗi.
PHP
// Lấy ra chuỗi SQL thô
$sql = User::where('status', 'active')->toSql();
// Kết quả: SELECT * FROM users WHERE status = ?
// Nhìn thấy cả dữ liệu truyền vào (Laravel mới)
User::where('status', 'active')->ddRawSql();
// Kết quả hiển thị ngay: SELECT * FROM users WHERE status = 'active'
3. Đo lường hiệu năng và Debug nhanh trên Giao diện
Đo thời gian thực thi bằng Benchmark Class
Được giới thiệu từ các phiên bản Laravel gần đây, Class Benchmark giúp bạn đo đạc chính xác một đoạn code hoặc một hàm tốn bao nhiêu mili-giây để xử lý. Nó cực kỳ hữu ích khi bạn cần cân nhắc hiệu năng giữa các giải pháp code khác nhau.
PHP
use Illuminate\Support\Benchmark;
class OrderController extends Controller
{
public function index()
{
// Trả về thời gian thực thi của câu lệnh
return Benchmark::measure(fn () => Order::all());
}
}
Chuỗi kết thúc tinh tế hơn với Inline ->dd() và ->dump()
Thay vì phải bọc cả câu lệnh Eloquent hay một Collection vào trong hàm dd($result), bạn có thể viết nối đuôi (chaining) phương thức ->dd() hoặc ->dump() ngay ở cuối câu lệnh. Code sẽ liền mạch và dễ đọc hơn rất nhiều.
PHP
// Cách viết cũ:
$users = User::where('name', 'Taylor')->get();
dd($users);
// Cách viết hiện đại, tinh gọn:
User::where('name', 'Taylor')->get()->dd();
Lời kết
Debug và Log không chỉ đơn thuần là tìm ra chỗ code sai, mà là nghệ thuật làm chủ và hiểu rõ hệ thống đang vận hành ra sao. Bằng việc áp dụng các công cụ có sẵn như Log::withContext(), DB::whenQueryingForLongerThan(), và Benchmark, bạn sẽ tiết kiệm được hàng giờ đồng hồ rà soát mã nguồn khi có sự cố xảy ra trên Production.
Nguồn tham khảo tổng hợp: Laravel Daily Tips
