Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel Tap格式化程序:我在哪里实际格式化消息?_Php_Logging_Laravel 5.6_Formatter - Fatal编程技术网

Php Laravel Tap格式化程序:我在哪里实际格式化消息?

Php Laravel Tap格式化程序:我在哪里实际格式化消息?,php,logging,laravel-5.6,formatter,Php,Logging,Laravel 5.6,Formatter,在我的laravel应用程序中,需要将需要发送到slack的消息格式化。因此,我在config/logging.php中设置了一个空闲日志通道: 'slack' => [ 'driver' => 'slack', 'url' => /*Censored Hook URL*/, 'username' => 'MyApp', 'emoji' => ':gear:', 'level' =&g

在我的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(...);
        }
    }
}
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'         => [
    'driver'   => 'slack',
    'tap' => [App\Logging\SlackLogFormatter::class]
    'url'      => /*Censored Hook URL*/,
    'username' => 'MyApp',
    'emoji'    => ':gear:',
    'level'    => 'debug',
],
但是在我的格式化程序中,我在哪里处理日志条目本身呢?我的意思是:

  • $handler->setFormatter
    似乎不是
    \illumb\Log\Logger
    类的方法

  • 当我需要提供自定义格式时,我无法找到需要覆盖的方法。我的意思是我有调用方法,然后呢


  • slack的格式化程序应如下所示:

    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(...);
            }
        }
    }
    
    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格式化程序,如所示:

    此外,
    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);
                }
            }
        }
    
    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;
        }
    }
    
    

    有趣的是,当我保留pushProcessor部分时,我遇到了完全相同的问题:`Monolog\Handler\AbstractProcessingHandler::processRecord()的返回值必须是数组类型,null返回`Mine在Laravel 5.7版本及更早版本上进行了测试。