Setup Error Log Viewer trong Laravel: Tiện lợi nhưng phải Tuyệt đối Bảo mật
Có một thực tế là các Senior Engineer rất "lười", nhưng là cái lười có tư duy. Thay vì gõ lệnh dòng lệnh khô khan, chúng ta muốn một giao diện trực quan để lọc lỗi, tìm stack trace trong vài giây.
Tuy nhiên, mình từng chứng kiến một dự án suýt "bay màu" vì cài đặt các gói Log Viewer nhưng quên không chặn quyền truy cập. Kết quả là mọi lỗi SQL Query, đường dẫn file, thậm chí là một vài thông tin môi trường (Environment) bị phơi bày sạch sẽ qua một đường dẫn /log-viewer.
Hôm nay, mình sẽ hướng dẫn các bạn thiết lập Laravel Log Viewer theo cơ chế bảo mật đa lớp.
Bước 1: Cài đặt thư viện "quốc dân"
Chúng ta sẽ sử dụng opcodesio/log-viewer – đây là thư viện hiện đại, giao diện đẹp và hỗ trợ tìm kiếm cực nhanh.
composer require opcodesio/log-viewer
Giải thích: Tại sao chọn gói này thay vì các gói cũ? Vì nó hỗ trợ gom nhóm log, tải log nhanh và có sẵn các lớp Middleware bảo mật rất dễ tùy biến.
Bước 2: Publish cấu hình để "làm chủ" cuộc chơi
Đừng để cấu hình mặc định. Hãy đưa nó về "nhà" của mình để tùy chỉnh:
php artisan vendor:publish --tag="log-viewer-config"
Sau lệnh này, bạn sẽ có file config/log-viewer.php. Tại đây, bạn có thể đổi đường dẫn mặc định từ host/log-viewer thành một cái tên khó đoán hơn, ví dụ: host/internal-system-logs.
Bước 3: Thiết lập cơ chế bảo mật (Phần quan trọng nhất)
Đừng bao giờ để log viewer chạy ở môi trường production mà không có lớp bảo vệ. Chúng ta sẽ sử dụng Gate trong Laravel để kiểm soát.
1. Định nghĩa quyền truy cập trong AppServiceProvider
Mở file app/Providers/AppServiceProvider.php (hoặc AuthServiceProvider.php tùy phiên bản Laravel của bạn):
use Illuminate\Support\Facades\Gate;
public function boot(): void
{
Gate::define('viewLogViewer', function ($user) {
// Chỉ cho phép user có email cụ thể hoặc role Admin
return in_array($user->email, [
'admin@yourdomain.com',
'hoang.nguyen@company.com',
]);
});
}
2. Cấu hình trong config/log-viewer.php
Tìm đến phần middleware và gate, đảm bảo nó trông như thế này:
'middleware' => [
'web',
'auth', // Bắt buộc phải đăng nhập mới được xem
],
'gate' => 'viewLogViewer', // Sử dụng Gate chúng ta vừa định nghĩa ở trên
Giải thích: > * Middleware 'auth': Đảm bảo người lạ không thể mò ra URL.
Gate: Ngay cả khi là nhân viên trong công ty (đã login), nhưng nếu không có email trong "danh sách trắng", họ cũng không thể xem log.
Bước 4: Chặn truy cập từ bên ngoài bằng IP Whitelist (Tùy chọn nâng cao)
Nếu bạn muốn bảo mật mức "chiến binh", hãy tạo một Middleware riêng để chỉ cho phép các IP của công ty hoặc IP của chính bạn truy cập vào đường dẫn này.
Tạo middleware: php artisan make:middleware CheckAdminIp
Trong middleware, kiểm tra request()->ip() với một danh sách IP cố định.
Thêm middleware này vào file cấu hình log-viewer.
Bước 5: Tối ưu hóa dung lượng (Rotation)
Log Viewer sẽ vô dụng nếu file log nặng vài GB làm server treo. Hãy đảm bảo bạn đã cấu hình log rotation trong .env:
LOG_CHANNEL=daily
LOG_DAILY_DAYS=14
Giải thích: Laravel sẽ chia nhỏ file log theo từng ngày và chỉ giữ lại 14 ngày gần nhất. Điều này giúp Log Viewer load cực nhanh và tránh đầy ổ cứng.
Tổng kết
Việc cài đặt Log Viewer chỉ mất 5 phút, nhưng thiết lập bảo mật cho nó mới là thứ khẳng định tư duy của một Senior Backend.
Tóm tắt quy trình:
- Cài đặt thư viện qua Composer.
- Publish config để đổi URL mặc định.
- Dùng Gate kết hợp auth middleware để chặn người lạ.
- Cấu hình daily log để tối ưu hiệu suất.
Hy vọng bài viết này giúp hệ thống của bạn chuyên nghiệp và an toàn hơn!
All rights reserved