Laravel松弛日志,但具有其他字段和配置

时间:2018-07-16 14:09:00

标签: php laravel slack slack-api

在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独白文件,但并非所有参数都可在此配置中工作。 例如,表情符号和用户名不起作用-我不知道slack是否已经有更改机器人用户名的选项。 另一个示例是,在此文件中,该文件称为useAttachment,在这里它只是附件-存储名称的位置。

回到我做的话题:

 Log::info('added test',['test'=>'test']);

它可以工作,但是为了节省时间,我想在每个请求中发送其他字段:

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

我怎么能做到?我需要以某种方式连接到Log Class和Slack驱动程序,但是我不知道该怎么做?

2 个答案:

答案 0 :(得分:0)

我能够更接近解决方案,但还是没有: 现在在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;
                });
            }
        }
    }

}

并且仅当我不尝试在松弛状态下进行自定义附件时它才有效。.当我尝试这样做时:

$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丢失了“ attachments”数组。我在SlackWebhookHandler中的write函数中检查了它,因为在返回时,此pushProcessor仍然存在,但没有发送给slack。我知道这可能与$handler->setFormatter($formatter);有关,但是如果我删除它,问题仍然存在-因此我仍然不知道如何解决。

答案 1 :(得分:0)

我调试了SlackRecord :: getSlackData,在那里您看到他如何处理附件并将附加数据添加到记录中。

对我来说,完全适合在logging.php中为Slack Channel设置'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并查看他为何跳过所需的附件部分。