Laravel 8 為通道自定義 Monolog

2021-07-17 16:45 更新

有時需要完全控制已存在通道的 Monolog:比如,你可能想要為給定通道的日志處理配置自定義的 Monolog FormatterInterface 實現。

先在通道配置中定義一個 tap 數組。 tap 數組包含一個在通道創(chuàng)建后有機會用于自定義 Monolog 實例的類列表:

'single' => [
    'driver' => 'single',
    'tap' => [App\Logging\CustomizeFormatter::class],
    'path' => storage_path('logs/laravel.log'),
    'level' => 'debug',
],

一旦在通道中有了 tap 選項配置,就要準備用于自定義 Monolog 實例的類。這種類這需要一個方法: __invoke,它接受一個 Illuminate\Log\Logger 實例作為其參數。 Illuminate\Log\Logger 實例將所有方法調用代理到基礎的 Monolog 實例:

<?php

namespace App\Logging;

use Monolog\Formatter\LineFormatter;

class CustomizeFormatter
{
    /**
     * 自定義給定的日志實例
     *
     * @param  \Illuminate\Log\Logger  $logger
     * @return void
     */
    public function __invoke($logger)
    {
        foreach ($logger->getHandlers() as $handler) {
            $handler->setFormatter(new LineFormatter(
                '[%datetime%] %channel%.%level_name%: %message% %context% %extra%'
            ));
        }
    }
} 

技巧:所有的 “tap” 類都是由 服務容器 解析的,因此任何依賴它們的構造器都會自動被注入。


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號