当前位置: 首页 > 后端技术 > PHP

laravel哨兵

时间:2023-03-29 23:03:00 PHP

注册登录GitHub登录创建项目选择laravel安装扩展使用composerrequiresentry/sentry-laravelphpartisanvendor:publish--provider="Sentry\SentryLaravel\SentryLaravelServiceProvider"publicfunctionreport(Exception$exception){if(app()->bound('哨兵')&&$this->shouldReport($exception)){app('哨兵')->captureException($exception);}parent::report($exception);}viconfig/sentry.phpreturnarray('dsn'=>env('DSN'),//捕获释放为gitsha//'release'=>trim(exec('gitlog--pretty="%h"-n1HEAD')),//捕获SQL查询上的绑定'breadcrumbs.sql_bindings'=>true,//捕获默认用户上下文'user_context'=>false,//传输函数https://docs.sentry.io/clients/php/config/'transport'=>new\App\SentryTransport(),);vi/app/SentryTransport.phpnamespaceApp;//classSentryTransport{publicstaticfunction__set_state($array){返回函数($raven_client,$data){\Queue::pushOn('sentry_log',new\App\Commands\sentry($raven_client,$data));};}}viapp/commands/sentry.phpclasssentryextendsCommandimplementsSelfHandling,ShouldBeQueued{使用InteractsWithQueue,SerializesModels;私人$raven_client;受保护的数据;/***创建一个新的命令实例。**@returnvoid*/publicfunction__construct($raven_client,$data){$raven_client->setTransport(null);}$raven_client->close_curl_resource();$this->raven_client=$raven_client;$this->data=$data;}/***执行命令。**@returnvoid*/publicfunctionhandle(){$this->raven_client->send($this->data);//发送方法来自/vendor/sentry/sentry/lib/Raven/Client.php:1019}}vi/vendor/sentry/sentry/lib/Raven/Client.phppublicfunctionsend(&$data){if(is_callable($this->send_callback)&&call_user_func_array($this->send_callback,array(&$data))===false){//如果send_callback返回false,结束nativesendreturn;}if(!$this->server){返回;}if($this->transport){call_user_func($this->transport,$this,$data);返回;}//这个事件应该被采样吗?如果(rand(1,100)/100.0>$this->sample_rate){返回;}$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测试少量写分号,查看效果monolog发送到sentrycomposerrequiremonolog/monologviconfig/app.php'App\Providers\sentrylog'viApp\Providers\sentrylog.phpuseMonolog\Handler\RedisHandler;使用Monolog\Formatter\JsonFormatter;使用Monolog\Formatter\LineFormatter;使用Monolog\Processor\MemoryPeakUsageProcessor;使用Monolog\Processor\WebProcessor;使用Monolog\Handler\RavenHandler;类sentrylogextendsServiceProvider{/***引导应用程序服务。**@returnvoid*/publicfunctionboot(){$logger=\Log::getMonolog();$handler=newRedisHandler($redis,"sentry:monolog",\Monolog\Logger::DEBUG);$handler->setFormatter(newJsonFormatter(JsonFormatter::BATCH_MODE_NEWLINES,true));$handler->pushProcessor(newMemoryPeakUsageProcessor(true));/*$logger->pushProcessor(function($record){$record['extra']['dummy']='Helloworld!';return$record;});classMemoryPeakUsageProcessorextendsMemoryProcessor{/***@paramarray$record对象时方法调用时执行*@returnarray*/公共函数__invoke(array$record){$bytes=memory_get_peak_usage($this->realUsage);$formatted=$this->formatBytes($bytes);$record['extra']['memory_peak_usage']=$formatted;返回$记录;}}*/$arr=['uri'=>'REQUEST_URI','ip'=>'REMOTE_ADDR','method'=>'REQUEST_METHOD','query_string'=>'QUERY_STRING','cookie'=>'HTTP_COOKIE','host'=>'HTTP_HOST',];$handler->pushProcessor(newWebProcessor(null,$arr));$logger->pushHandler($handler);}/***注册应用服务。**@returnvoid*/publicfunctionregister(){//}}viapp/commands/sentry_monolog.phpuseMonolog\Handler\RavenHandler;while(true){$data=$redis->lpop("sentry:monolog");如果(!$数据){睡眠(5);继续;}$data=json_decode($data,true);$raven_client=new\Raven_Client($dsn,['extra'=>$data['extra']]);$raven_hanlder=newRavenHandler($raven_client);$raven_hanlder->handle($data);//https://pagerefresh.co.uk/apigen/monolog/class-Monolog.Handler.RavenHandler.htmlvendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php:handlevendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php:write$raven_client->__destruct();}Resources也可以在本地搭建Sentry,部署到生产环境自带哨兵服务CentOS6基于Python安装SentrySentry异常自动提醒Laravel学习笔记错误追踪神器——Sentrysentry使用entry/onpremise搭建一个Sentry异常汇总工具高效使用Sentry跟踪日志发现问题sentrymonologSentry-处理异常日志的正确姿势Sentry监控Django应用,使用邮件+钉钉通知搭建一个私有的前端监控服务:sentry