首页 > 解决方案 > Laravel Tap Formatter:我在哪里实际格式化消息?

问题描述

在我的 laravel 应用程序中,需要格式化一条我需要发送到 slack 的消息。因此,我将松弛日志通道设置为config/logging.php

'slack'         => [
    'driver'   => 'slack',
    'url'      => /*Censored Hook URL*/,
    'username' => 'MyApp',
    'emoji'    => ':gear:',
    'level'    => 'debug',
],

同样如文档中所见,我可以做一个独白格式化程序,因此我做了以下事情:

namespace App\Logging;

class SlackLogFormatter
{
    /**
     * Customize the given logger instance.
     *
     * @param  \Illuminate\Log\Logger  $logger
     * @return void
     */
    public function __invoke($logger)
    {
        foreach ($logger->getHandlers() as $handler) {
            $handler->setFormatter(...);
        }
    }
}

并将其指定为点击我的日志:

'slack'         => [
    'driver'   => 'slack',
    'tap' => [App\Logging\SlackLogFormatter::class]
    'url'      => /*Censored Hook URL*/,
    'username' => 'MyApp',
    'emoji'    => ':gear:',
    'level'    => 'debug',
],

但是在我的格式化程序中,我在哪里处理日志条目本身?我是说:

  1. $handler->setFormatter似乎不是类的方法\Illuminate\Log\Logger

  2. 当我需要提供自定义格式时,我找不到需要重写的方法。我的意思是我有调用方法,然后呢?

标签: phplogginglaravel-5.6formatter

解决方案


Dimitrios 几乎是正确的(或者这可能适用于旧版本)但正如 Xavier 所说,如果您准确复制该代码,您将收到错误

Return value of Monolog\Handler\AbstractProcessingHandler::processRecord() must be of the type array, null returned

你会想要做这样的事情,而不是:

<?php

namespace App\Logging;

use Monolog\Formatter\LineFormatter;
use Monolog\Handler\SlackWebhookHandler;
use Request;

class CustomiseFormatter
{
    protected $request;

    public function __construct(Request $request = null)
    {
        $this->request = $request;
    }

    public function __invoke($logger)
    {
        foreach ($logger->getHandlers() as $handler) {
            if ($handler instanceof SlackWebhookHandler) {
                $handler->setFormatter(new LineFormatter(
                    '[%datetime%] %channel%.%level_name%: %message% %context% %extra%'
                ));

                $handler->pushProcessor([$this, 'processLogRecord']);
            }
        }
    }

    public function processLogRecord(array $record): array
    {
        $record['extra'] += [
            'url' => env("APP_URL"),
        ];

        return $record;
    }
}

同样,与extra修改方式一样,您可以更改任何其他值。


推荐阅读