使用 Sentry 为 PHP 和 Web 移动小程序提供多平台错误监控

今天我在 reddit 上看到 Sentry 的推广,想到 19 年我第一次在公司自研产品b2b2c上使用 Sentry 的经历,后面在其他项目上多次使用Sentry,今天就顺手分享一下在 Laravel 项目中接入 Sentry 的实践心得。

现代项目往往涉及 Web、移动端和小程序,错误追踪和日志集中化显得尤其重要,Sentry 在这方面真的挺香的。

安装与基础配置

Laravel 后端集成 Sentry 很直观,官方提供了 SDK。最简单的安装方式是通过 Composer

composer require sentry/sentry-laravel

然后在 config/app.php 注册服务提供者(Laravel 5.x):

Sentry\Laravel\ServiceProvider::class,

或者在 Laravel 6+ 可以直接使用自动发现。配置文件可以发布出来:

php artisan vendor:publish --provider="Sentry\Laravel\ServiceProvider"

会生成 config/sentry.php,里面可以设置 DSN、环境、采样率等。比如:

return ['dsn' => env('SENTRY_DSN'),'environment' => env('APP_ENV', 'production'),'traces_sample_rate' => 0.2,
];

前端 Vue 使用官方 JS SDK:

npm install @sentry/vue @sentry/tracing

初始化示例:

import * asSentryfrom"@sentry/vue";
import { Integrations } from"@sentry/tracing";Sentry.init({app,
dsn: process.env.VUE_APP_SENTRY_DSN,
integrations: [newIntegrations.BrowserTracing()],
tracesSampleRate: 0.2,
});

移动端 iOS/Android 可用官方 SDK 或第三方桥接库,注意需要在 info.plist 或 AndroidManifest 中声明权限。

微信小程序比较特殊,需要在 微信公众平台配置域名白名单,否则 SDK 无法向 Sentry 发送数据。具体是把 Sentry 的上报域名加入 request 合法域名即可。

环境区分与配置优化

在 Laravel 中,可以通过 .env 文件区分环境:

SENTRY_DSN_DEV=https://xxx@sentry.io/123
SENTRY_DSN_PROD=https://yyy@sentry.io/456
APP_ENV=dev

然后在 config/sentry.php 中根据环境选择 DSN:

'dsn' => env('APP_ENV') === 'prod' ? env('SENTRY_DSN_PROD') : env('SENTRY_DSN_DEV'),

这样开发、预发和生产环境的事件不会互相干扰。同时可以调整 traces_sample_rate 或日志等级,避免开发环境刷屏。

捕获异常与忽略策略

Laravel 默认会捕获异常并发送到 Sentry,但有些非致命错误不需要打扰,例如第三方包的警告。可以在 before_send 钩子中过滤:

Sentry\configureScope(function (Sentry\State\Scope $scope): void {$scope->addEventProcessor(function (array $event) {if (isset($event['exception']) && str_contains($event['exception']['values'][0]['type'], 'SomeNonCriticalException')) {return null; // 忽略}return $event;});
});

同时也可以手动捕获异常:

try {// 业务逻辑
} catch (\Exception $e) {Sentry\captureException($e);
}

前端 Vue、移动端或小程序同理,可以根据 error.message 或 URL 过滤不必要的事件。

与队列和日志结合

Laravel 队列任务出错时,如果没有捕获,异常可能被吞掉。推荐在 Handler 或队列 Job 中统一处理:

public function failed(Exception $exception)
{Sentry\captureException($exception);
}

结合日志系统也很方便,Sentry 可以作为自定义日志通道:

'channels' => ['sentry' => ['driver' => 'sentry',],
],

这样 Log::channel('sentry')->error('Something happened') 就能发送到 Sentry,同时保留本地日志。

跨平台注意事项

  1. 1. Vue 前端:一定要配置 source map,这样 Sentry 才能显示真实的行号和文件。

  2. 2. iOS/Android:建议在 release 版本开启符号化上传,这样崩溃栈才可读。

  3. 3. 微信小程序:除了域名白名单,还要考虑 network timeout,避免 SDK 堵塞前端逻辑。

小技巧是前端可以捕获全局未处理异常,统一发送:

window.addEventListener('error', event => {Sentry.captureException(event.error);
});

Sentry 平台部署

除了 SDK 集成,很多人关心 Sentry 本身的平台选型。Sentry 提供两种模式:SaaS 和 独立部署

SaaS 版本就是官方托管的服务,你只需要注册账号、配置 DSN,就能马上收集错误,省去运维烦恼,升级和安全都由官方负责。适合绝大多数中小型项目或者希望快速落地的团队。

独立部署则可以把 Sentry 安装在自己的服务器上,完全控制数据、网络访问和存储策略。部署难度稍高,需要配置 PostgreSQL、Redis、Kafka 等依赖,也需要处理版本升级和备份策略,但对数据隐私要求高或者企业内网项目,这几乎是唯一选择。不过,官方提供了Docker镜像可以直接使用。

实际上,在企业里经常看到混合使用:研发环境或小型项目走 SaaS,核心业务走自建,既灵活又安全。Laravel 项目接入时,只要 DSN 对应正确,代码层面无需额外改动,平台切换非常顺畅。

实用技巧与优化

  • • 批量忽略低优先级错误,比如 404 或第三方脚本错误。

  • • 调整采样率降低重复告警,例如 traces_sample_rate: 0.1

  • • 配合 release 标签区分不同版本,便于追踪回归问题:

Sentry\configureScope(function (Sentry\State\Scope $scope): void {$scope->setTag('release', config('app.version'));
});
  • • 队列和日志结合,保证即便异步任务失败,也能可靠上报。

写在最后

从 SDK 集成到平台部署,其实 Sentry 的魅力就在于统一、多端、可扩展。多环境、多平台、队列日志结合后,你会发现错误的可见性大大提高,排查问题也不再是盲人摸象的状态。19 年 BBC 的经历到现在依然印象深刻,Sentry 帮我节省了无数调试时间。今天分享出来,希望对大家 Laravel 项目的多平台错误监控有所启发。

写作不易,希望您动动发财的小手,帮忙一键三连(点赞、推荐、关注),您的鼓励,就是我写作的动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95776.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95776.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python包管理工具全对比:pip、conda、Poetry、uv、Flit深度解析

在Python开发中,包的管理和使用是重要环节,现如今python包管理工具众多,如何选择合适的管理工具?常用的工具有pip、conda、Poetry、uv、Flit,下面这些工具进行详细对比分析。一、工具概览对比工具类型开发者主要特点适…

车载诊断架构 --- Service 14一丢丢小汇总

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做你把时间花在哪里,你的人生就在哪里。千万别看见别人发光,就觉得自己暗淡。人生如逆旅,你我皆行人。唯有不断阅己、越己、悦己才能活出生命的意…

Struts2 工作总结

一 in,在SQL中,IN 是一个条件操作符,用于指定多个可能的值,通常用在 WHERE 子句中。它的作用是检查某个字段的值是否在给定的值列表中,相当于多个 OR 条件的简写形式。不使用 IN(冗长)SELECT * …

MQTT 认证与授权机制实践(二)

四、实战案例:主流 Broker 的认证授权配置指南(一)EMQ X:企业级物联网 Broker 的安全方案1. 认证配置(用户名密码 证书)EMQ X 作为一款企业级物联网 Broker,在安全认证方面提供了丰富且灵活的配…

多路转接介绍及代码实现

目录 1.多路转接技术的产生背景 2.select 3.poll 3.epoll 1.多路转接技术的产生背景 一个技术的出现必然有它要解决的问题,那么多路转接解决的问题是什么嗯? 我们知道,一个进程里面有一个文件描述符表管理这个进程所打开的文件,我们进行网络通信的时候,本质就是创建一个…

《sklearn机器学习——回归指标1》

skearn.metrics模块实现一些损失函数,评分,并且应用函数去测度回归标签。其中一些已经改进,可以处理多指标案例:mean_squared_error,mean_absolute_error,explained_variance_score和r2_score。 这些函数使…

消息存储机制-索引文件及页缓存

对于生产者来说,将消息写到commit log文件里面。这里会有消息的逻辑队列,逻辑队列里面保存了消息的偏移量。除了consumerquenue之外,它还会将数据分发到另外一个文件叫indexfile索引文件里面。这个索引文件可以保存消息的一些信息&#xff0c…

辗转相除法(欧几里得算法)的证明

欢迎访问我的主页: https://heeheeaii.github.io/ 辗转相除法是一种用于计算两个非负整数最大公约数的有效算法。它的证明主要分为两个部分: 证明核心引理: gcd(a,b)gcd(b,amodb)证明算法的收敛性: 证明算法一定会在有限步内结束。 辗转相除法…

RL【3】:Bellman Optimality Equation

系列文章目录 文章目录系列文章目录前言Definition of optimal policyBellman optimality equationIntroductionMaximization on the right-hand sideContraction mapping theoremSolutionOptimalityAnalyzing optimal policies总结前言 本系列文章主要用于记录 B站 赵世钰老师…

有序数组,距离目标最近的k个数 二分查找

🤔 新手做题思路:第1步:理解题目- 找距离x最近的k个数- 数组已排序- 返回结果也要排序(升序)- 距离相同时,选择较小的数第2步:关键insight- 数组已排序 → 考虑二分查找- 最近的k个数一定是连续…

学习心得分享

我认为知识是一定要系统化的学习,结构化梳理,这样在运用或思考的时候,能够回忆起自己在这一块梳理的知识结构,如果有记录那么能快速回忆并理解,如果没有记录,那么说明对自己来说超纲了,把知识进…

为什么说 Linode 和 DigitalOcean 的差距,不止于 VPS?

在今天这个全球化的商业战场上,中国企业的出海已从“选择题”变为“必答题”。当我们满怀雄心,将产品和业务推向海外市场时,基础设施的选择,往往是决定成败的第一步。它不仅关乎成本与性能,更直接影响着团队的开发效率…

NSSCTF每日一题_Web_[SWPUCTF 2022 新生赛]奇妙的MD5

为了保持做题的感觉和持续学习,也就有了每日一题系列,选一些有意义的题目或者一些CTF新颖题目作为参考学习。[SWPUCTF 2022 新生赛]奇妙的MD51. 访问首页界面并进行分析估计题目MD5提示,查询得知ffifdyop 这个字符串是一个奇妙的MD5字符串因为将“ffifdy…

服务器IP暴露被攻击了怎么办?

当服务器IP暴露后,可能会面临各种网络攻击,如DDoS攻击、端口扫描、恶意入侵等,这将严重影响服务器的正常运行和数据安全。本文将从检测攻击类型、采取紧急防护措施、优化服务器配置、寻求专业支持以及预防未来攻击五个方面,详细探…

TDengine 时间函数 TIMETRUNCATE 用户手册

TDengine TIMETRUNCATE 函数用户使用手册 函数概述 TIMETRUNCATE 是 TDengine 中的一个时间处理标量函数,用于将时间戳按照指定的时间单位进行截断操作。该函数在时间数据聚合、分组和统计分析中非常有用,特别适用于智能电表等时序数据的分析场景。 语…

Linux电脑怎样投屏到客厅的大电视?支持远程投屏吗?

一般的电脑投屏软件都会推出Windows版本和macOS版本,虽然这两个版本已经覆盖大部分消费者的常用电脑,但是依然有一部分群体因为电脑系统版本问题不能使用投屏软件。 如果你当前使用的是Linux系统的电脑,而且又要将电脑投屏投屏到客厅的大电视…

MP4视频太大如何压缩?分享6种简单便捷的压缩小技巧

随着拍摄高清视频的设备越来越多,我们经常会遇到MP4视频文件体积过大的问题,无论是上传到社交平台、发送给朋友,还是存储在设备中,过大的视频文件都会带来诸多不便。那么,MP4视频太大怎么压缩呢?本文将介绍…

k8s 部署 redis

创建部署文件 vim redis.yaml添加如下内容: apiVersion: v1 kind: Namespace metadata:name: redis --- apiVersion: v1 kind: Secret metadata:name: redis-passwordnamespace: redis type: Opaque data:password: d2d3cmhnZWE # 建议生产环境使用更复杂的密码 ---…

FFMPEG H264

一、H264压缩编码1.1 H264 中的 I 帧、P帧和 B帧H264 使用帧内压缩和帧间压缩的方式提高编码压缩率;H264 采用了独特的 I 帧、P 帧和 B 帧策略来实现,连续帧之间的压缩;1.2 其他概念GOP(图像组):一个IDR帧到…

Unity 解决天空盒中间出现一条线

问题解决找到天空盒对应贴图,在Inspector 面板中找到Advanced →Generate Mip Maps 并取消勾选即可。效果动态修改天空盒RenderSettings.skybox targetSkyboxMaterial; DynamicGI.UpdateEnvironment();