摘要:注冊登錄登錄創建選擇安裝擴展使用方法來自配置獲取測試少寫個分號查看效果發送到對象當方法調用時執行資源你也可以本地搭建之部署到生產環境搭建自己的服務基于安裝自
注冊登錄
GitHub登錄
創建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方法來自 /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
測試少寫個分號,查看效果
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 對象當方法調用時執行 * @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 之部署到生產環境
搭建自己的 sentry 服務
CentOS6 基于 Python 安裝 Sentry
Sentry 自動化異常提醒
Laravel學習筆記之Errors Tracking神器——Sentry
sentry使用
利用 entry/onpremise 搭建一個 Sentry 異常匯總工具
高效利用Sentry追蹤日志發現問題
sentry monolog
Sentry - 處理異常日志的正確姿勢
Sentry監控Django應用并使用email+釘釘通知
搭建私有的前端監控服務: sentry
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29567.html
摘要:中異常處理類主要包含兩個方法和,其中就是主要用來向第三方發送異常報告,這里選擇向這個神器發送異常報告,并使用通知開發人員。通過也能發現的執行流程。 說明:Laravel學習筆記之bootstrap源碼解析中聊異常處理時提到過Sentry這個神器,并打算以后聊聊這款神器,本文主要就介紹這款Errors Tracking神器Sentry,Sentry官網有一句話個人覺得帥呆了: Stop ...
摘要:查閱官方文檔后得知,新版為了防止對象的序列化反序列化漏洞被利用,不再對值進行自動的序列化和反序列化處理。舉個栗子更新到后,因為不再自動對值進行序列化處理,而只能加密字符串數據,這個時候程序就會拋出錯誤。 最近手殘升級了項目里 Laravel 的小版本號(v5.5.39 => v5.5.45),這不升級則已,一升級就出了問題! Sentry 平臺上提示錯誤:openssl_encrypt...
摘要:簡介另一個令人喜歡的地方,是擁有活躍的開發者社區,而活躍的開發者社區帶來的,是繁華的擴展包生態該項目統計了目前下載量最高的個擴展包。記得喲相信下面這些擴展包會讓你的編碼更加高效。排名下載量排名包地址下載次數描述圖片處理。 簡介 Laravel 另一個令人喜歡的地方,是擁有活躍的開發者社區,而活躍的開發者社區帶來的,是繁華的擴展包生態 ———— @Summer 該項目統計了目前 pack...
摘要:現在的提供了一種更易于使用和維護的計劃任務方式。注意事項建議開啟這樣會極大的加速類的加載。 lumen 為速度而生的 Laravel 框架 官網的介紹很簡潔,而且 lumen 確實也很簡單,我在調研了 lumen 相關組件(比如緩存,隊列,校驗,路由,中間件和最重要的容器)之后認為已經能夠滿足我目前這個微服務的需求了。 任務目標 showImg(https://segmentfault...
摘要:請求未通過的驗證時會拋出此異常。異常處理是非常重要但又容易讓開發者忽略的功能,這篇文章簡單解釋了內部異常處理的機制以及擴展異常處理的方式方法。 異常處理是編程中十分重要但也最容易被人忽視的語言特性,它為開發者提供了處理程序運行時錯誤的機制,對于程序設計來說正確的異常處理能夠防止泄露程序自身細節給用戶,給開發者提供完整的錯誤回溯堆棧,同時也能提高程序的健壯性。 這篇文章我們來簡單梳理一下...
閱讀 2060·2023-04-25 17:48
閱讀 3577·2021-09-22 15:37
閱讀 2932·2021-09-22 15:36
閱讀 5863·2021-09-22 15:06
閱讀 1634·2019-08-30 15:53
閱讀 1422·2019-08-30 15:52
閱讀 706·2019-08-30 13:48
閱讀 1116·2019-08-30 12:44