每次触发Log :: error时发送松弛通知

时间:2015-09-02 13:08:54

标签: laravel laravel-5

使用Laravel 5,我希望每次通过直接调用此方法或默认{{1}时触发Log::error(或类似)通知(松弛但无关紧要)调用ExceptionHandler方法。我想我必须扩展默认的Laravel的日志系统,但我不确定。 最好的" laravel方式"这样做?(不改变我整个代码中的每个report次调用)。

首先,我认为我只需将Log Facade更改为另一个,但它不会处理Log::error(即由于未捕获的异常而导致500个错误)。另一个解决方案是直接在ExceptionHandler中添加一些代码,但如果我按ExceptionHandler或其他方式(Log::error()app('logger')->error()报告错误,则不会触发该代码等等。)。

3 个答案:

答案 0 :(得分:18)

编辑:从Laravel 5.6开始破碎

Log外观实际上只是Monolog的基础实例的包装器。好消息是Monolog带来了对Slack的支持。你只需要告诉Monolog使用它。

据说,一切都可以用3行代码设置。

$monolog = \Log::getMonolog();
$slackHandler = new \Monolog\Handler\SlackHandler('your-token', '#your-channel', 'Monolog', true, null, \Monolog\Logger::ERROR);
$monolog->pushHandler($slackHandler);

然后,要启用此功能,您可以为其创建自己的服务提供商,也可以将其放入AppServiceProvider的{​​{1}}方法中。

您可能希望查看boot的源代码,以防构造函数需要使用更多选项。

现在,只要您SlackHandler,该错误的消息就会被发送到您已设置的Slack频道。请注意这个"起泡"这意味着它将被发送到Slack通道以查找任何已完成日志记录的错误,\Log::error('some error');errorcriticalalert。如果您只想记录emergency,请将bubble参数设置为false

答案 1 :(得分:8)

对于Laravel 5.6及以上版本:

Laravel支持从5.6开始记录的松弛驱动程序。在config/logging.php中配置您的松弛通道,如下所示:

'slack' => [
    'driver' => 'slack',
    'url' => env('LOG_SLACK_WEBHOOK_URL'),
    'username' => 'Laravel Log',
    'emoji' => ':boom:',
    'level' => 'critical',
],

现在所有具有重要性或以上重要性的日志消息将自动记录到松弛通道。

您还可以专门登录松弛渠道:

Log::channel('slack')->info('Something happened!');

Laravel loggingSlack incoming webhooks中的详细信息。

答案 2 :(得分:6)

您可以收听illuminate.log [String $level, String $message, Array $context]事件。如果$level等于error,您将发送通知。

EventServiceProvider

中定义事件监听器
protected $listen = [
    'illuminate.log' => [
        'App\Listeners\LogEventListener'
    ]
];

这将告诉Laravel在LogEventListener事件被触发时触发illuminate.log

然后创建此侦听器:

namespace App\Listeners;

use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class LogEventListener
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  DeployDisabledEvent  $event
     * @return void
     */
    public function handle($event)
    {
        if ($event->type == 'error') {
            $this->notifyViaSlack($event->message, $event->context);
        }
    }

    /**
     * Send Slack notification.
     *
     * @param  string  $message
     * @param  string  $context
     * @return void
     */
    protected function notifyViaSlack($message, $context)
    {
        /*
         * Slack notification logic
         */
    }
}