Monolog là thư viện mạnh mẽ tích hợp sẵn trong Laravel, giúp bạn quản lý log hiệu quả. Bài viết này sẽ hướng dẫn bạn cách tùy chỉnh log lưu vào file, database,... một cách chi tiết.

1. Cài đặt môi trường

Laravel đã tích hợp sẵn Monolog, do đó bạn không cần cài đặt thêm thư viện. Tuy nhiên, hãy đảm bảo rằng file cấu hình logging của bạn (config/logging.php) đã được cấu hình mặc định.

Bước kiểm tra:

Mở file config/logging.php và kiểm tra sự tồn tại của driver stack hoặc single.

Ví dụ:

php
config/logging.php
'channels' => [
    'stack' => [
        'driver' => 'stack',
        'channels' => ['daily'],
    ],
    'single' => [
        'driver' => 'single',
        'path' => storage_path('logs/laravel.log'),
        'level' => 'debug',
    ],
],

2. Tạo Custom Log với Monolog

2.1. Thêm Channel mới vào Logging

Bạn có thể thêm một channel mới trong file config/logging.php để xử lý log theo cách tùy chỉnh.

Ví dụ: Tạo channel lưu log vào file custom.log

Mở file config/logging.php và thêm một channel mới như sau:

php
config/logging.php
'channels' => [
    'custom_file' => [
        'driver' => 'single',
        'path' => storage_path('logs/custom.log'),
        'level' => 'info',
    ],
],

Sử dụng:

Trong controller hoặc service của bạn, sử dụng channel này để ghi log:

php
use Illuminate\Support\Facades\Log;

Log::channel('custom_file')->info('Đây là một custom log message!', [
    'context' => 'Thông tin bổ sung'
]);

2.2. Lưu Log vào cơ sở dữ liệu

Để lưu log vào database, bạn cần tạo một custom channel sử dụng driver monolog và cấu hình handler để ghi vào cơ sở dữ liệu.

Bước 1: Tạo Migration

Tạo một bảng lưu log:

shell
php artisan make:migration create_logs_table

Trong file migration:

php
Schema::create('logs', function (Blueprint $table) {
    $table->id();
    $table->string('level');
    $table->text('message');
    $table->json('context')->nullable();
    $table->timestamps();
});

Chạy lệnh:

shell
php artisan migrate

Bước 2: Tạo Custom Channel

Thêm cấu hình trong config/logging.php:

php
config/logging.php
use Monolog\Handler\AbstractProcessingHandler;
use Monolog\Logger;

'channels' => [
    'database' => [
        'driver' => 'custom',
        'via' => App\Logging\DatabaseLogger::class,
        'level' => 'info',
    ],
],

Bước 3: Tạo Custom Logger

Tạo directory App/Logging:

shell
php artisan make:directory App/Logging

Trong file App\Logging\DatabaseLogger.php:

php
app/Logging/DatabaseHandler.php
<?php

namespace App\Logging;

use Monolog\Handler\AbstractProcessingHandler;
use Monolog\Logger;
use Monolog\LogRecord;
use Illuminate\Support\Facades\DB;

class DatabaseHandler extends AbstractProcessingHandler
{
    protected function write(LogRecord $record): void
    {
        DB::table('logs')->insert([
            'level' => $record->level->getName(),
            'message' => $record->message,
            'context' => json_encode($record->context),
            'created_at' => now(),
            'updated_at' => now(),
        ]);
    }
}

Trong file App\Logging\DatabaseLogger.php:

php
app/Logging/DatabaseLogger.php
<?php

namespace App\Logging;

use Monolog\Logger;

class DatabaseLogger
{
    public function __invoke(array $config)
    {
        $logger = new Logger('custom_database');
        $logger->pushHandler(new DatabaseHandler());
        return $logger;
    }
}

Sử dụng:

php
Log::channel('database')->info('Log lưu vào database', ['context' => 'Thêm chi tiết']);

2.3. Lưu Log vào nhiều nơi cùng lúc (Stack Channels)

Bạn có thể kết hợp nhiều channels thành một stack để ghi log vào nhiều nơi cùng lúc.

Cấu hình stack trong config/logging.php:

php
'channels' => [
    'custom_stack' => [
        'driver' => 'stack',
        'channels' => ['custom_file', 'database'],
    ],
],

Sử dụng:

php
Log::channel('custom_stack')->error('Log này sẽ được ghi vào file và database');

3. Tùy biến mức độ Log

Laravel hỗ trợ các mức độ log như sau:

  • emergency: Sự cố nghiêm trọng (không thể hoạt động).
  • alert: Yêu cầu hành động ngay lập tức.
  • critical: Lỗi nghiêm trọng.
  • error: Lỗi runtime.
  • warning: Cảnh báo.
  • notice: Thông tin quan trọng.
  • info: Thông tin chung.
  • debug: Thông tin debug.

Bạn có thể tùy chỉnh mức độ log trong từng channel bằng cách cấu hình level trong config/logging.php.

4. Kiểm tra kết quả

  • File: Kiểm tra file storage/logs/custom.log để xem log đã ghi.
  • Database: Kiểm tra bảng logs để xem log đã lưu.

Kết luận

Monolog là một công cụ mạnh mẽ giúp bạn quản lý log dễ dàng trong Laravel. Bằng cách tạo các custom channel, bạn có thể lưu log vào file, database hoặc bất kỳ dịch vụ nào khác. Điều này giúp bạn kiểm soát và phân tích ứng dụng tốt hơn.

Hãy thử áp dụng ngay hôm nay và chia sẻ ý kiến của bạn trên CodeTutHub! 🚀