使用Laravel 5,我希望每次通过直接调用此方法或默认{{1}时触发Log::error
(或类似)通知(松弛但无关紧要)调用ExceptionHandler
方法。我想我必须扩展默认的Laravel的日志系统,但我不确定。 最好的" laravel方式"这样做?(不改变我整个代码中的每个report
次调用)。
首先,我认为我只需将Log Facade更改为另一个,但它不会处理Log::error
(即由于未捕获的异常而导致500个错误)。另一个解决方案是直接在ExceptionHandler
中添加一些代码,但如果我按ExceptionHandler
或其他方式(Log::error()
,app('logger')->error()
报告错误,则不会触发该代码等等。)。
答案 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');
,error
,critical
和alert
。如果您只想记录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!');
答案 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
*/
}
}