摘要:注冊(cè)登錄登錄創(chuàng)建選擇安裝擴(kuò)展使用方法來(lái)自配置獲取測(cè)試少寫個(gè)分號(hào)查看效果發(fā)送到對(duì)象當(dāng)方法調(diào)用時(shí)執(zhí)行資源你也可以本地搭建之部署到生產(chǎn)環(huán)境搭建自己的服務(wù)基于安裝自
注冊(cè)登錄
GitHub登錄
創(chuàng)建project 選擇 laravel
composer require sentry/sentry-laravel
php artisan vendor:publish --provider="SentrySentryLaravelSentryLaravelServiceProvider"
public function report(Exception $exception) { if (app()->bound("sentry") && $this->shouldReport($exception)) { app("sentry")->captureException($exception); } parent::report($exception); } vi config/sentry.php return array( "dsn" => env("DSN"), // capture release as git sha // "release" => trim(exec("git log --pretty="%h" -n1 HEAD")), // Capture bindings on SQL queries "breadcrumbs.sql_bindings" => true, // Capture default user context "user_context" => false, //transport function https://docs.sentry.io/clients/php/config/ "transport"=>new AppSentryTransport(), ); vi /app/SentryTransport.php namespace App; // class SentryTransport { public static function __set_state($array){ return function($raven_client,$data){ Queue::pushOn("sentry_log",new AppCommandssentry($raven_client,$data)); }; } } vi app/commands/sentry.php class sentry extends Command implements SelfHandling, ShouldBeQueued { use InteractsWithQueue, SerializesModels; private $raven_client; protected $data; /** * Create a new command instance. * * @return void */ public function __construct($raven_client, $data) { $raven_client->setTransport(null); $raven_client->close_curl_resource(); $this->raven_client=$raven_client; $this->data=$data; } /** * Execute the command. * * @return void */ public function handle() { $this->raven_client->send($this->data);//send方法來(lái)自 /vendor/sentry/sentry/lib/Raven/Client.php:1019 } } vi /vendor/sentry/sentry/lib/Raven/Client.php public function send(&$data) { if (is_callable($this->send_callback) && call_user_func_array($this->send_callback, array(&$data)) === false ) { // if send_callback returns false, end native send return; } if (!$this->server) { return; } if ($this->transport) { call_user_func($this->transport, $this, $data); return; } // should this event be sampled? if (rand(1, 100) / 100.0 > $this->sample_rate) { return; } $message = $this->encode($data); $headers = array( "User-Agent" => static::getUserAgent(), "X-Sentry-Auth" => $this->getAuthHeader(), "Content-Type" => "application/octet-stream" ); $this->send_remote($this->server, $message, $headers); }配置dsn
獲取 dsn
測(cè)試少寫個(gè)分號(hào),查看效果
composer require monolog/monolog vi config/app.php "AppProviderssentrylog" vi AppProviderssentrylog.php use MonologHandlerRedisHandler; use MonologFormatterJsonFormatter; use MonologFormatterLineFormatter; use MonologProcessorMemoryPeakUsageProcessor; use MonologProcessorWebProcessor; use MonologHandlerRavenHandler; class sentrylog extends ServiceProvider { /** * Bootstrap the application services. * * @return void */ public function boot() { $logger = Log::getMonolog(); $handler = new RedisHandler($redis, "sentry:monolog", MonologLogger::DEBUG); $handler->setFormatter(new JsonFormatter(JsonFormatter::BATCH_MODE_NEWLINES, true)); $handler->pushProcessor(new MemoryPeakUsageProcessor(true)); /*$logger->pushProcessor(function ($record) { $record["extra"]["dummy"] = "Hello world!"; return $record; }); class MemoryPeakUsageProcessor extends MemoryProcessor { /** * @param array $record 對(duì)象當(dāng)方法調(diào)用時(shí)執(zhí)行 * @return array */ public function __invoke(array $record) { $bytes = memory_get_peak_usage($this->realUsage); $formatted = $this->formatBytes($bytes); $record["extra"]["memory_peak_usage"] = $formatted; return $record; } }*/ $arr = [ "uri" => "REQUEST_URI", "ip" => "REMOTE_ADDR", "method" => "REQUEST_METHOD", "query_string" => "QUERY_STRING", "cookie" => "HTTP_COOKIE", "host" => "HTTP_HOST", ]; $handler->pushProcessor(new WebProcessor(null, $arr)); $logger->pushHandler($handler); } /** * Register the application services. * * @return void */ public function register() { // } } vi app/commands/sentry_monolog.php use MonologHandlerRavenHandler; while (true) { $data = $redis->lpop("sentry:monolog"); if (!$data) { sleep(5); continue; } $data = json_decode($data, true); $raven_client= new Raven_Client($dsn,["extra" => $data["extra"]]); $raven_hanlder = new RavenHandler($raven_client); $raven_hanlder->handle($data);//https://pagerefresh.co.uk/apigen/monolog/class-Monolog.Handler.RavenHandler.html vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php:handle vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php :write $raven_client->__destruct(); }資源
你也可以本地搭建
Sentry 之部署到生產(chǎn)環(huán)境
搭建自己的 sentry 服務(wù)
CentOS6 基于 Python 安裝 Sentry
Sentry 自動(dòng)化異常提醒
Laravel學(xué)習(xí)筆記之Errors Tracking神器——Sentry
sentry使用
利用 entry/onpremise 搭建一個(gè) Sentry 異常匯總工具
高效利用Sentry追蹤日志發(fā)現(xiàn)問(wèn)題
sentry monolog
Sentry - 處理異常日志的正確姿勢(shì)
Sentry監(jiān)控Django應(yīng)用并使用email+釘釘通知
搭建私有的前端監(jiān)控服務(wù): sentry
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/29567.html
摘要:中異常處理類主要包含兩個(gè)方法和,其中就是主要用來(lái)向第三方發(fā)送異常報(bào)告,這里選擇向這個(gè)神器發(fā)送異常報(bào)告,并使用通知開發(fā)人員。通過(guò)也能發(fā)現(xiàn)的執(zhí)行流程。 說(shuō)明:Laravel學(xué)習(xí)筆記之bootstrap源碼解析中聊異常處理時(shí)提到過(guò)Sentry這個(gè)神器,并打算以后聊聊這款神器,本文主要就介紹這款Errors Tracking神器Sentry,Sentry官網(wǎng)有一句話個(gè)人覺得帥呆了: Stop ...
摘要:查閱官方文檔后得知,新版為了防止對(duì)象的序列化反序列化漏洞被利用,不再對(duì)值進(jìn)行自動(dòng)的序列化和反序列化處理。舉個(gè)栗子更新到后,因?yàn)椴辉僮詣?dòng)對(duì)值進(jìn)行序列化處理,而只能加密字符串?dāng)?shù)據(jù),這個(gè)時(shí)候程序就會(huì)拋出錯(cuò)誤。 最近手殘升級(jí)了項(xiàng)目里 Laravel 的小版本號(hào)(v5.5.39 => v5.5.45),這不升級(jí)則已,一升級(jí)就出了問(wèn)題! Sentry 平臺(tái)上提示錯(cuò)誤:openssl_encrypt...
摘要:簡(jiǎn)介另一個(gè)令人喜歡的地方,是擁有活躍的開發(fā)者社區(qū),而活躍的開發(fā)者社區(qū)帶來(lái)的,是繁華的擴(kuò)展包生態(tài)該項(xiàng)目統(tǒng)計(jì)了目前下載量最高的個(gè)擴(kuò)展包。記得喲相信下面這些擴(kuò)展包會(huì)讓你的編碼更加高效。排名下載量排名包地址下載次數(shù)描述圖片處理。 簡(jiǎn)介 Laravel 另一個(gè)令人喜歡的地方,是擁有活躍的開發(fā)者社區(qū),而活躍的開發(fā)者社區(qū)帶來(lái)的,是繁華的擴(kuò)展包生態(tài) ———— @Summer 該項(xiàng)目統(tǒng)計(jì)了目前 pack...
摘要:現(xiàn)在的提供了一種更易于使用和維護(hù)的計(jì)劃任務(wù)方式。注意事項(xiàng)建議開啟這樣會(huì)極大的加速類的加載。 lumen 為速度而生的 Laravel 框架 官網(wǎng)的介紹很簡(jiǎn)潔,而且 lumen 確實(shí)也很簡(jiǎn)單,我在調(diào)研了 lumen 相關(guān)組件(比如緩存,隊(duì)列,校驗(yàn),路由,中間件和最重要的容器)之后認(rèn)為已經(jīng)能夠滿足我目前這個(gè)微服務(wù)的需求了。 任務(wù)目標(biāo) showImg(https://segmentfault...
摘要:請(qǐng)求未通過(guò)的驗(yàn)證時(shí)會(huì)拋出此異常。異常處理是非常重要但又容易讓開發(fā)者忽略的功能,這篇文章簡(jiǎn)單解釋了內(nèi)部異常處理的機(jī)制以及擴(kuò)展異常處理的方式方法。 異常處理是編程中十分重要但也最容易被人忽視的語(yǔ)言特性,它為開發(fā)者提供了處理程序運(yùn)行時(shí)錯(cuò)誤的機(jī)制,對(duì)于程序設(shè)計(jì)來(lái)說(shuō)正確的異常處理能夠防止泄露程序自身細(xì)節(jié)給用戶,給開發(fā)者提供完整的錯(cuò)誤回溯堆棧,同時(shí)也能提高程序的健壯性。 這篇文章我們來(lái)簡(jiǎn)單梳理一下...
閱讀 2130·2023-04-25 17:48
閱讀 3615·2021-09-22 15:37
閱讀 2960·2021-09-22 15:36
閱讀 6052·2021-09-22 15:06
閱讀 1662·2019-08-30 15:53
閱讀 1456·2019-08-30 15:52
閱讀 736·2019-08-30 13:48
閱讀 1146·2019-08-30 12:44