Laravel의 Exception을 Slack으로 알림
개요
Laravel의 통지와 예외 처리의 공부를 위해서 구현해 보았습니다.
Notification에 관한 기사는 다수 있어, 공식 문서에서도 해설되고 있습니다만, 비망록으로서 간단한 흐름을 남겨 둡니다.
환경
사전 준비
Guzzle 및 slack-notification-channel 설치
$ composer install guzzlehttp/guzzle
$ composer install laravel/slack-notification-channel
Slack의 WebhookURL 얻기
이번에는 env의 값을 config를 통해 사용합니다.
webhookURL 취득 절차에 대해서는 생략합니다 ...
config\slack.php
return [
'name' => env('SLACK_NAME'),
'channel' => env('SLACK_CHANNEL'),
'webhook_url' => env('SLACK_WEBHOOK_URL'),
];
알림용 클래스 만들기
일단 slack에 메시지를 보낼 수 있도록 구현합니다.
초기 상태에서는 메일 송신이 디폴트가 되어 있으므로, slack용으로 변경해 줍니다.
App\Notifications\Slack.php;
<?php
namespace App\Notifications;
use Exception;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Messages\SlackMessage;
class Slack extends Notification
{
use Queueable;
protected $name;
protected $channnel;
protected $content;
/**
* Create a new notification instance.
*
* @return void
*/
public function __construct($message)
{
$this->name = config(slack.name);
$this->channel = config(slack.channnel);
$this->content = $message;
}
/**
* Get the notification's delivery channels.
*
* @param mixed $notifiable
* @return array
*/
public function via($notifiable)
{
return ['slack'];
}
/**
* Get the array representation of the notification.
*
* @param mixed $notifiable
* @return array
*/
public function toArray($notifiable)
{
return [
//
];
}
/**
* @param $notifiable
* @return $this
*/
public function toSlack($notifiable)
{
return (new SlackMessage)
->from($this->name)
->to($this->channel)
->content($this->content);
}
}
생성자로 message를 받아 toSlack()로 그대로 송신하는 심플한 처리입니다.
알림을 전달하는 채널을 slack로 만들기 위해 via() 안을 'slack'로 변경합니다.
슬랙 알림을 위한 경로 만들기
App\Service\Slack\SlackNotifiable.php
<?php
namespace App\Service\Slack;
use Illuminate\Notifications\Notifiable;
use App\Notifications\SlackNotification;
use Exception;
use Illuminate\Notifications\RoutesNotifications;
class SlackNotifiable
{
use Notifiable;
protected function routeNotificationForSlack()
{
return config('slack.webhook_url');
}
}
실제로 Slack 알림을 루트하기 위해 routeNotificationForSlack()을 정의하고 WebhookURL을 반환합니다.
Notifiable 트레이트를 읽고 notify()로 알림을 보낼 수 있습니다.
이제 Slack에게 메시지를 보낼 준비가 괜찮습니다!
예외 처리에 알림 포함
Laravel의 에러 핸들링은 기본적으로 app\Exceptions\Handler.php가 담당하고 있습니다.
거친 흐름으로는
로그인 오류, 유효성 검사 오류 등 ...
이번에는 예외 감지시 알림을 보내고 싶으므로 report()를 편집합니다.
App\ExceptionsHandler.php
public function report(Exception $exception)
{
$slackHook = new SlackNotifiable();
$slackHook->notify(new Slack($exception));
parent::report($exception);
}
SlackNotifiable의 인스턴스를 작성해, notify() 메소드를 실행하는 것으로 통지를 보내고 있습니다.
인수에 캐치 한 예외 $exception 를 건네주고 있습니다.
Slack 알림용 클래스 수정
마지막으로 App\Notifications\Slack.php에서 예외 내용을 알리도록 수정합니다.
App\Notifications\Slack.php;
<?php
namespace App\Notifications;
use Exception;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Messages\SlackMessage;
class Slack extends Notification
{
use Queueable;
protected $name;
protected $channnel;
protected $exception;
/**
* Create a new notification instance.
*
* @return void
*/
public function __construct(Exception $e)
{
$this->name = config(slack.name);
$this->channel = config(slack.channnel);
$this->exception = $e;
}
/**
* Get the notification's delivery channels.
*
* @param mixed $notifiable
* @return array
*/
public function via($notifiable)
{
return ['slack'];
}
/**
* Get the array representation of the notification.
*
* @param mixed $notifiable
* @return array
*/
public function toArray($notifiable)
{
return [
//
];
}
/**
* @param $notifiable
* @return $this
*/
public function toSlack($notifiable)
{
$exception = $this->exception;
return (new SlackMessage)
->from($this->name)
->to($this->channel)
->error()
->content('エラーを検知しました')
->attachment(function ($attachment) use ($exception) {
$attachment
->title(get_class($exception))
->content($exception->getMessage());
});
}
}
생성자에서 Exception을 받도록 수정하고 있습니다.
이제 오류 내용을 Slack에서 확인할 수 있습니다!
결론
끝까지 읽어 주셔서 감사합니다.
이르지 못하는 점 등 있으면, 코멘트에서 지적해 주시면 고맙습니다 ...
라라벨의 통지 처리를 이해하는데 좋은 공부가 되었습니다.
다음은 큐라든가 사용한 비동기 처리도 해보고 싶다.
참고 기사
Reference
이 문제에 관하여(Laravel의 Exception을 Slack으로 알림), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Stuffy86/items/99b7b5e8b8a478a56108텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)