0

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ày
    errorlog Sử dụng ErrorLogHandler class ghi log và file log ghi vào errorlog của php
    monolog 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 cloud
    single 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 chat
    stack 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, permissionlocking

    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

image.png

  • 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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí