Компактный формат Slack уведомлений в Laravel 7
Как отформатировать/кастомизировать slack уведомления/логи через webhook в Laravel 7.
Тем, кого не устраивает дефолтный вид slack уведомлений и хочется более простого и компактного формата.
Вид дефолтного уведомления в slack.
Ожидаю, что LOG_SLACK_WEBHOOK_URL уже прописан в конфиге .env. Если нет, см. Slack уведомления с помощью Incoming WebHooks.
1. Создаем кастомный LoggingFormatter в app/Logging/SlackCustomFormatter.php:
<?php
namespace App\Logging;
use Monolog\Formatter\LineFormatter;
use Monolog\Handler\SlackWebhookHandler;
class SlackCustomFormatter
{
/**
* Customize the given logger instance
* @param \Illuminate\Log\Logger $logger
* @return void
*/
public function __invoke(\Illuminate\Log\Logger $logger)
{
foreach ($logger->getHandlers() as $handler) {
if ($handler instanceof SlackWebhookHandler) {
$handler->getSlackRecord()->useAttachment(false);
$handler->setFormatter(new LineFormatter('%datetime% %channel% %level_name%: %message%'));
}
}
}
}
Расширенные примеры конфигурации $handler
//$format = '[%datetime%] %channel%.%level_name%: %message% %context% %extra%'; // @note Default format
$format = '%datetime% %channel% %level_name%: %message% %emoji%';
$formatter = new LineFormatter($format, 'Y-m-d H:i:s');
// @note Append extra info of formatting here
$handler->pushProcessor(function($record) {
$record['emoji'] = ":boom:";
return $record;
});
$handler->setFormatter($formatter);
2. Регистрируем SlackCustomFormatter в конфиге config/logging.php:
'slack' => [
'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'),
'username' => 'Wipo Grabber',
'emoji' => ':boom:',
'level' => 'debug', // @note Default: critical
'tap' => [\App\Logging\SlackCustomFormatter::class],
],
3. Отправляем уведомление:
\Log::channel('slack')->info("System log message to slack");
Итоговый вид уведомления:
5:06 2020-08-21 16:06:06 local INFO: System log message to slack
* В качестве примера можно посмотреть пакет: https://github.com/gmponos/monolog-slack/
#laravel, #log, #slack, #webhook, #formatter, #monolog