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ụ:
'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:
'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:
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:
php artisan make:migration create_logs_tableTrong file migration:
Schema::create('logs', function (Blueprint $table) {
$table->id();
$table->string('level');
$table->text('message');
$table->json('context')->nullable();
$table->timestamps();
});Chạy lệnh:
php artisan migrateBước 2: Tạo Custom Channel
Thêm cấu hình trong 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:
php artisan make:directory App/LoggingTrong file App\Logging\DatabaseLogger.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
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:
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:
'channels' => [
'custom_stack' => [
'driver' => 'stack',
'channels' => ['custom_file', 'database'],
],
],Sử dụng:
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! 🚀








