Logging trong Laravel
Giới thiệu
- Để giúp bạn biết hệ thống đang xảy ra vấn đề gì trong hệ thống, Laravel cung cấp các dịch vụ ghi log mạnh mẽ cho phép bạn ghi log vào file, vào log hệ thống hoặc thậm chí là Slack để thông báo cho toàn bộ team của bạn
- Không chỉ để giúp bạn debug mà nó còn giúp bạn ghi lại những lịch sử thực thi theo mong muốn
- Laravel sử dụng thự viện Monolog để cung cấp và hỗ trợ nhiều cách xử lý log khác nhau. Bạn cũng có thể cấu hình lại hoặc kết hợp sử dụng để xử lý log theo ý muốn
1. Cấu hình và các loại channel driver
Tất cả cấu hình log nằm trong file config/logging.php
Mặc định Laravel sẽ sử dụng stack
channel để lưu log
-
Các channel drivers Có rất nhiều loại log channel mà Laravel cung cấp. Tùy theo yêu cầu của dự án mà bạn có thể sử dụng 1 hoặc kết hợp nhiều loại channel log dưới đây:
Name Description custom Driver cho phép bạn gọi đến một class factory để tạo ra 1 channel mới daily Sử dụng RotatingFileHandler
class ghi log và file log sẽ được sinh ra hàng ngàyerrorlog Sử dụng ErrorLogHandler
class ghi log và file log ghi vào errorlog của phpmonolog Là một factory driver cho phép bạn sử dụng bất kỳ mọi Monolog handled nào null Là một driver bỏ qua tất cả các log papertrail Sử dụng SyslogUdpHandler
class ghi log và log sẽ được lưu trữ trên cloudsingle Là một driver cho phép bạn lưu log vào 1 file duy nhất slack Sử dụng SlackWebHookHandler
để ghi log đến slack - 1 ứng dụng chatstack Cho phép bạn có thể sử dụng nhiều channel syslog Sử dụng SyslogHandler
để ghi log đến system log của hệ điều hành
-
Channel Single và Daily : Riêng channel single và daily có thêm 3 option config : buble, permission và locking
Name Description Default bubble Cho phép ghi log vào những channel khác không ví dụ như khi dùng stack true locking Lock lại file log trước khi ghi vào false permission Tùy chọn permissions cho file log 0644
-
Daily channel: có thêm tùy chọn days là số ngày file log được giữ, mặc định sẽ là 7 ngày.
-
Papertrail channel : sẽ cần config host và port của cloud bạn dùng để ghi log
-
Slack channel: sẽ cần url configuration, mặc định slack sẽ chỉ nhận các log ở mức critical trở lên
-
Deprecations log: Để log lại những cảnh báo về những feature không dùng tới nữa thì sử dụng deprecations
- Log level : emergency, alert, critical, error, warning, notice, info, and debug.
2. Chỉ định 1 log channel khác
-
Sử dụng 1 log channel khác với channel mặc định ta sử dụng Log facade để truy xuất và log vào bất kỳ channel nào đã định nghĩa:
use Illuminate\Support\Facades\Log; Log::channel('slack')->info('Something happened!');
-
Để tạo logging stack theo mong muốn bạn sử dụng stack method:
Log::stack(['single', 'slack'])->info('Something happened!');
-
Tạo 1 channel mong muốn bằng cách cung cấp 1 mảng cấu hình vào build method:
use Illuminate\Support\Facades\Log; Log::build([ 'driver' => 'single', 'path' => storage_path('logs/custom.log'), ])->info('Something happened!');
3. Tạo custom channel bằng cách tạo Factory class
-
Trước tiên bạn cần phải tạo 1 factory class, class này sẽ trả về 1 Monolog instance. Trong class này bạn sẽ cần định nghĩa 1 method là __invoke, method này cần truyền vào 1 mảng cấu hình :
namespace App\Logging; use Monolog\Logger; use Monolog\Handler\StreamHandler; class CustomLogger { public function __invoke(array $config) { $logger = new Logger($config['name']); $logger->pushHandler(new StreamHandler($config['path'], $config['level'])); return $logger; } }
-
Sau đó định nghĩa custom log channel của bạn trong config/longging.php, sử dụng via để trỏ đến class factory của bạn vừa tạo ở trên
'channels' => [ // ... 'custom' => [ 'driver' => 'custom', 'via' => App\Logging\CustomLogger::class, 'name' => 'my-channel', 'path' => storage_path('logs/my-channel.log'), 'level' => 'debug', ], ],
-
Là bạn đã có thể sử dụng custom channel của mình
use Illuminate\Support\Facades\Log; // ... Log::channel('custom')->debug('This is a debug message for my custom channel');
All rights reserved