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

rap*_*2-h 8 laravel laravel-5

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

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

use*_*496 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);
Run Code Online (Sandbox Code Playgroud)

然后得到这个运行,你可以为它创建自己的服务提供商或刚落,它AppServiceProviderboot方法.

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

现在,无论何时\Log::error('some error');,该错误的消息都将发送到您已设置的Slack通道.请注意,这个"冒泡",这意味着它会被发送到时差通道的任何记录进行错误了,error,critical,alert,和emergency.如果您只想记录s bubble,false请将参数设置为error.

  • Monolog现在也有一个更容易使用的"SlackWebhookHandler",它使用Slack webhooks.他们的"SlackHandler"使用Slack oauth令牌来获取和设置起来有点棘手. (4认同)
  • @Ryan https://github.com/rap2hpoutre/laravel-epilog(希望它能帮到你!) (2认同)

Sap*_*aik 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',
],
Run Code Online (Sandbox Code Playgroud)

更多信息在Laravel docsSlack传入webhooks.

  • @bigcat当你使用它们来实际定义配置时不会。默认情况下,这是引用 Laravel 中的 env。 (2认同)

Max*_*nin 6

你可以听听illuminate.log [String $level, String $message, Array $context]活动.如果$level等于error,您将发送通知.

在你的中定义事件监听器 EventServiceProvider

protected $listen = [
    'illuminate.log' => [
        'App\Listeners\LogEventListener'
    ]
];
Run Code Online (Sandbox Code Playgroud)

这将告诉Laravel LogEventListenerilluminate.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
         */
    }
}
Run Code Online (Sandbox Code Playgroud)