Laravel 8 为通道自定义 Monolog
有时需要完全控制已存在通道的 Monolog:比如,你可能想要为给定通道的日志处理配置自定义的 Monolog FormatterInterface
实现。
先在通道配置中定义一个 tap
数组。 tap
数组包含一个在通道创建后有机会用于自定义 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” 类都是由 服务容器 解析的,因此任何依赖它们的构造器都会自动被注入。