Laravel 日志管理:自定义错误通道
我们可以使用以下几种方式来创建自定义通道
为通道自定义 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;
class CustomizeFormatter
{
/**
* 自定义给定的日志实例。
*
* @param \Illuminate\Log\Logger $logger
* @return void
*/
public function __invoke($logger)
{
foreach ($logger->getHandlers() as $handler) {
$handler->setFormatter(...);
}
}
}
创建 Monolog 处理器通道
Monolog 多种 可用处理器。在某些情况下,你会希望仅创建一个带有指定处理器的 Monolog 驱动的日志类型。这些通道可以使用 monolog
驱动创建。
在使用 monolog
驱动时, handler
配置项用于指定被实例化的处理器。如果该处理器的构造器需要参数,可以使用可选的 with
配置项来指定:
'logentries' => [
'driver' => 'monolog',
'handler' => Monolog\Handler\SyslogUdpHandler::class,
'with' => [
'host' => 'my.logentries.internal.datahubhost.company.com',
'port' => '10000',
],
],
Monolog 格式化
使用 monolog
驱动时,Monolog 的 LineFormatter
用于默认的格式化处理器。当然,你也可以使用 formatter
and formatter_with
配置项自定义格式化处理器类型:
'browser' => [
'driver' => 'monolog',
'handler' => Monolog\Handler\BrowserConsoleHandler::class,
'formatter' => Monolog\Formatter\HtmlFormatter::class,
'formatter_with' => [
'dateFormat' => 'Y-m-d',
],
],
如果所用的 Monolog 处理器能够提供自带的格式代处理器,可以将 formatter
配置项指定为 default
:
'newrelic' => [
'driver' => 'monolog',
'handler' => Monolog\Handler\NewRelicHandler::class,
'formatter' => 'default',
],
通过工厂创建渠道
如果你想定义一个完全自定义的通道,你可以完全控制 Monolog 的实例化和配置,你可以在 config/logging.php
配置文件中指定 custom
驱动程序类型。 你的配置应该包含一个 via
选项,指向将被调用以创建 Monolog 实例的工厂类:
'channels' => [
'custom' => [
'driver' => 'custom',
'via' => App\Logging\CreateCustomLogger::class,
],
],
一旦配置了 custom
通道,就可以定义创建 Monolog 实例的类。 这个类只需要一个方法: __invoke
,它就可以返回 Monolog 实例:
<?php
namespace App\Logging;
use Monolog\Logger;
class CreateCustomLogger
{
/**
* 创建一个 Monolog 实例.
*
* @param array $config
* @return \Monolog\Logger
*/
public function __invoke(array $config)
{
return new Logger(...);
}
}