【问题标题】:Laravel Tap Formatter: where do I actually format the message?Laravel Tap Formatter:我在哪里实际格式化消息?
【发布时间】:2023-03-08 20:21:02
【问题描述】:

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

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

正如documentation 所见,我可以做一个独白格式化程序,因此我做了以下操作:

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. 当我需要提供自定义格式时,我找不到需要重写的方法。我的意思是我有调用方法,然后呢?

【问题讨论】:

  • 有趣的是我也有同样的问题

标签: php logging laravel-5.6 formatter


【解决方案1】:

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 的修改方式一样,您可以更改任何其他值。

【讨论】:

  • 我在 Laravel 5.7 及更早版本上测试过。
【解决方案2】:

slack 的格式化程序应该如下:

namespace App\Logging;

use Monolog\Formatter\LineFormatter;

class SlackLogFormatter
{
    /**
     * Customize the given logger instance.
     *
     * @param  \Illuminate\Log\Logger  $logger
     * @return void
     */
    public function __invoke($logger)
    {
        foreach ($logger->getHandlers() as $handler) {
            if ($handler instanceof SlackWebhookHandler) {
                $format=""; // Look on the Monolog's Line formatter documentation
                $formatter= new LineFormatter($format,"Y-m-d H:i:s");


                $handler->pushProcessor(function ($record) {
                   //Append extra info of formatting here
                });

                $handler->setFormatter($formatter);
            }
        }
    }
}

并配置 slack 不发送附件以使格式化程序正常工作:

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

setFormatter 方法采用新的 Monolog Formatter,如下所示:https://github.com/Seldaek/monolog/blob/master/doc/02-handlers-formatters-processors.md#formatters

pushProcessor 还允许您在消息中填充额外的字段,例如。在您的日志消息中显示表情符号:

    public function __invoke($logger)
    {
        foreach ($logger->getHandlers() as $handler) {
            if ($handler instanceof SlackWebhookHandler) {
                $format="%emoji% %message%"; 
                $formatter= new LineFormatter($format,"Y-m-d H:i:s");

                $handler->pushProcessor(function ($record) {
                         $record['emoji']=":poop:";
                });

                $handler->setFormatter($formatter);
            }
        }
    }

【讨论】:

  • 当我保留 pushProcessor 部分时,我有这个错误:` Monolog\Handler\AbstractProcessingHandler::processRecord() 的返回值必须是数组类型,返回 null `
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 2011-04-12
  • 2018-02-07
  • 2013-05-12
  • 2016-04-22
  • 2011-03-15
相关资源
最近更新 更多