Php Laravel松弛日志,但带有附加字段和配置

Php Laravel松弛日志,但带有附加字段和配置,php,laravel,slack,slack-api,Php,Laravel,Slack,Slack Api,在Laravel 5.6中,我尝试制作适当的松弛日志,我做到了: 'channels' => [ 'stack' => [ 'driver' => 'stack', 'channels' => ['single', 'slack'], ], 'slack' => [ 'driver' => 'slack', 'url' => env('LOG_SLACK_WEBHO

在Laravel 5.6中,我尝试制作适当的松弛日志,我做到了:

'channels' => [
    'stack' => [
        'driver' => 'stack',
        'channels' => ['single', 'slack'],
    ],

    'slack' => [
        'driver' => 'slack',
        'url' => env('LOG_SLACK_WEBHOOK_URL'),
        'username' => 'TEST',
        'icon' => ':boom:',
        'level' => 'info',
    ],
它可以工作,但我想指定额外的字段,如果它匹配其他一些条件,可能会对其进行一些自定义

我正在查看SlackWebhookHandler.php monolog文件,但并不是所有参数都在这个配置中工作。。 例如,表情符号和用户名不起作用-我不知道slack是否已经有了更改机器人用户名的选项。 另一个例子是,在这个文件中,它被称为useAttachment,而在这里,它只是一个附件-名称存储在哪里

回到我做过的主题:

 Log::info('added test',['test'=>'test']);
它可以工作,但对于slack,我想在每个请求中发送额外的字段,例如:

'added test',['test'=>'test', 'more' => 'test2']

我怎样才能完成它?我需要以某种方式连接到Log Class和slack driver,但我不知道如何做到这一点?

我能够更接近解决方案,但仍然没有: 在logging.php上,我现在有了

'slack' => [
    'driver' => 'slack',
    'url' => env('LOG_SLACK_WEBHOOK_URL'),
    'tap' => [App\Logging\SlackLogger::class],
    'username' => 'BOT',
    'attachment' => false,
    'emoji' => ':boom:',
    'level' => 'info',
],
我创建了App/Logging/SlackLogger.php:

namespace App\Logging;

use Monolog\Logger;
use Monolog\Handler\SlackWebhookHandler;
use Monolog\Formatter\LineFormatter;
use Monolog\Formatter\JsonFormatter;


class SlackLogger
{
    /**
     * Customize the given logger instance.
     *
     * @param  \Illuminate\Log\Logger  $logger
     * @return void
     */
    public function __invoke($logger)
    {
        $dateFormat = "Y-m-d H:i:s";
        $checkLocal = env('APP_ENV');

        foreach ($logger->getHandlers() as $handler) {
            if ($handler instanceof SlackWebhookHandler) {
                $output = "[$checkLocal]: %datetime% > %level_name% - %message% `%context% %extra%` :poop: \n";
                $formatter = new LineFormatter($output, $dateFormat);

                $handler->setFormatter($formatter);
                $handler->pushProcessor(function ($record) {

                    $record['extra']['dummy'] = 'test';

                    return $record;
                });
            }
        }
    }

}
只有当我不尝试在slack上制作自定义附件时,它才会起作用。。当我尝试这样做时:

$handler->pushProcessor(function ($record) {

  $record['extra']['dummy'] = 'test';

  $record['attachments'] = [
      'color' => "#36a64f",
      "title" => "Slack API Documentation",
      "text" => "Optional text that appears within the attachment"
  ];

  return $record;
});

$record losts“attachments”数组。。我在写函数中的SlackWebhookHandler中检查它,因为在返回的这个pushProcessor中它仍然存在,但没有发送到slack。我知道这可能与
$handler->setFormatter($formatter)有关但如果我删除它,问题仍然存在-因此我仍然不知道如何解决它。

我将自己调试到SlackRecord::getSlackData,在这里您可以看到他如何处理附件并将的附加数据添加到记录中

对我来说,在logging.php中为Slack通道设置
'context'=>true完全合适,并定义一个处理器,它只将我需要的数据添加到记录中

class SlackProcessor {

    /**
     * @param array $record
     * @return array
     */
    public function __invoke(array $record) {
        $record["context"]["Env"] = env("LOG_SLACK_USERNAME", "localhost");
        $record["context"]["Full URL"] = Request::fullUrl();
        $record["extra"]["Request Data"] = Request::all();

        return $record;
    }
}
因此,也许您可以再次调试到
getSlackData
,看看他为什么跳过您需要的附件部分