1,/app/Http/Middleware/目录下新增文件Monitor.php
<?php namespace App/Http/Middleware; use Error; use Closure; use Exception; use Illuminate/Http/Request; use Illuminate/Contracts/Container/Container; use Illuminate/Contracts/Debug/ExceptionHandler; use Psy/Exception/ErrorException; use Psy/Exception/FatalErrorException; class Monitor { /** * The App container * * @var Container */ protected $container; /** * The Monitor Client * * @var */ protected $monitor; /** * Create a new middleware instance. * * @param Container $container */ public function __construct(Container $container) { $this->container = $container; } /** * Handle an incoming request. * * @param Request $request * @param Closure $next * @return mixed */ public function handle($request, Closure $next) { // dump("monitorDing"); $enabled = config('monitorDing.enabled'); try { $response = $next($request); } catch (Exception $e) { $response = $this->handleException($request, $e); $enabled && $this->sendText(sprintf("文件:%s (%s 行) 内容:%s", $e->getFile(), $e->getLine(), $e->getMessage())); } catch (Error $error) { $e = new FatalErrorException($error); $response = $this->handleException($request, $e); $enabled && $this->sendText(sprintf("文件:%s (%s 行) 内容:%s", $e->getFile(), $e->getLine(), $e->getMessage())); } catch (ErrorException $error) { $e = new FatalErrorException($error); $response = $this->handleException($request, $e); $enabled && $this->sendText(sprintf("文件:%s (%s 行) 内容:%s", $e->getFile(), $e->getLine(), $e->getMessage())); } finally { if ($response->getStatusCode() == '500' && (isset($response->exception) && $response->exception && $response->exception !== null)) { $sysName = config('monitorDing.web_name'); if (strpos($_SERVER['HTTP_HOST'], 'liexin') !== false) { $sysName = '本地' . $sysName; } else { $sysName = '外网' . $sysName; } $this->sendText(substr($sysName . ":" . $response->exception, 0, 500) . ',请求数据:' . json_encode($request->input()) . "---[更多详情请看日志]"); } } return $response; } /** * Handle the given exception. * * (Copy from Illuminate/Routing/Pipeline by Taylor Otwell) * * @param $passable * @param Exception $e * @return mixed * @throws Exception */ protected function handleException($passable, Exception $e) { if (!$this->container->bound(ExceptionHandler::class) || !$passable instanceof Request) { throw $e; } $handler = $this->container->make(ExceptionHandler::class); $handler->report($e); return $handler->render($passable, $e); } /** * 发送文本类型的消息 * * @param $content string 消息内容 * @param array $atMobiles 被@人的手机号 * @param bool $isAtAll 是否 @ 所有人 * @throws SendErrorException */ public function sendText($content, $atMobiles = [], $isAtAll = false) { $params = [ 'msgtype' => 'text', 'text' => [ 'content' => $content, ], 'at' => [ 'atMobiles' => $atMobiles, 'isAtAll' => $isAtAll ] ]; $this->send($params); } /** * 发送 * @param array $params 请求需要的参数 * @throws SendErrorException */ private function send($params = []) { if (!config('monitorDing.enabled')) { /Log::info('~~ Monitor Ding ~~'); /Log::info($params); } else { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, config("monitorDing.webhook")); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json;charset=utf-8')); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($params)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); if (config()) { curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); } $data = json_decode(curl_exec($ch), true); curl_close($ch); if ($data['errcode']) { // throw new SendErrorException($data['errmsg']); } } } }
View Code
2,Kernel.php新增/App/Http/Middleware/Monitor::class
3,,config文件新增monitorDing.php
<?php return [ // 是否开启报错写入 'enabled' => true, // curl证书验证, 线下环境不用开启 'curl_verify' =>"false", 'web_name'=>"钉钉告警关键词", // webhook的值 'webhook' => "钉钉告警地址", ];
完成
原创文章,作者:Carrie001128,如若转载,请注明出处:https://blog.ytso.com/tech/php/272173.html