Chiến Lược Log Tập Trung Cho Ứng Dụng Laravel

· 3 min read

Mặc định, Laravel ghi log vào storage/logs/laravel.log. Điều này tốt cho dev local. Nhưng tệ cho production.

  1. Khó truy cập: Bạn cần SSH vào server.
  2. Khó scale: Nếu bạn thêm server thứ hai, bạn giờ có hai file log.
  3. Khó tìm kiếm: "Grep" không phải là công cụ tìm kiếm.

Giải Pháp: Logging Channel

Laravel sử dụng Monolog bên trong. Bạn có thể cấu hình trong config/logging.php.

Chiến Lược 1: Channel "Stack"

Laravel sử dụng driver stack mặc định. Nó cho phép bạn gửi log đến nhiều nơi cùng lúc.

'channels' => [
    'stack' => [
        'driver' => 'stack',
        'channels' => ['daily', 'slack', 'papertrail'],
        'ignore_exceptions' => false,
    ],
],

Chiến Lược 2: Dịch Vụ Bên Ngoài (Papertrail / Logtail)

Các dịch vụ như Papertrail nhận output syslog. Rất dễ thiết lập.

config/logging.php

'papertrail' => [
    'driver' => 'monolog',
    'level' => 'debug',
    'handler' => SyslogUdpHandler::class,
    'handler_with' => [
        'host' => env('PAPERTRAIL_URL'),
        'port' => env('PAPERTRAIL_PORT'),
    ],
],

Giờ đây, tất cả log của bạn xuất hiện trong dashboard web, có thể tìm kiếm, xem trực tiếp, và từ TẤT CẢ server của bạn gộp lại.

Chiến Lược 3: Log Có Cấu Trúc

Đừng chỉ log chuỗi. Log dữ liệu.

Không tốt:

Log::error("User $user->id failed payment: " . $e->getMessage());
// Khó parse bằng chương trình

Tốt (Có cấu trúc):

Log::error('Payment failed', [
    'user_id' => $user->id,
    'amount' => $amount,
    'error' => $e->getMessage(),
    'trace' => $e->getTraceAsString(),
]);

Các công cụ quản lý log (Datadog, Kibana) có thể đánh index các key JSON này. Sau đó bạn có thể hỏi: "Cho tôi xem tất cả lỗi thanh toán với số tiền > $100"

Kết Luận

Hãy coi log như luồng sự kiện, không phải file. Chuyển chúng đến một collector tập trung (ELK, Datadog, Papertrail) và ngừng SSH vào server để đọc file text.

Bình luận