codeigniter 3 和 ci4 的 sentry 集成方式完全不同:ci3 用 sentry/sentry 1.x + raven_client::install() 全局注册处理器,ci4 必须用 sentry/sentry 3.x+ 并在 boot 事件中 init(),且 404 等路由错误需手动 capturemessage 上报。

直接上结论:CodeIgniter 3 和 CI4 的 Sentry 集成方式完全不同,CI3 可用 Raven_Client(sentry/sentry 1.x),CI4 必须用 sentry/sentry 3.x+ 并配合 PSR-15 中间件或手动 hook;别混用旧包,PHP 7.4+ 下 Raven_Client 会因废弃语法报错。
CI3 怎么装 sentry/sentry 1.x 并让错误自动上报
CI3 不支持原生 PSR-15,得靠 Raven_Client::install() 注册全局异常/错误处理器:
-
composer require sentry/sentry:1.10.0(这是最后一个兼容 PHP 5.6 的版本,CI3 常见于老环境) - 在
application/core/MY_Exceptions.php里重写log_exception(),末尾加$client->captureException($exception); - 在
index.php或application/config/autoload.php后追加初始化代码:$sentryClient = new Raven_Client('https://xxx@o123.ingest.sentry.io/456'); $sentryClient->install(); - 注意:如果项目启用了
error_reporting(0)或ini_set('display_errors', 'Off'),install()仍能捕获 fatal error,但需确保register_shutdown_function没被其他库覆盖
CI4 怎么避免 Sentry 初始化时机错误
CI4 生命周期更严格,new Sentry\Client() 不能放在 config 文件或任意位置——必须等 Autoloader 和 Services 初始化之后:
- 推荐在
app/Config/Events.php中监听boot事件:Events::on('boot', function () { if (env('SENTRY_DSN')) { \Sentry\init(['dsn' => env('SENTRY_DSN')]); } }); - 切勿在
app/Config/Services.php的public static function sentry()里直接init(),会导致重复初始化、上下文丢失 - 若要用中间件捕获请求级异常,中间件类必须实现
before()和after(),并在after()中检查response->getStatusCode() >= 400手动上报,因为 CI4 默认不把 4xx 当异常
为什么 Sentry 看不到 404 或路由错误
CI 的 404 是路由层拦截,不抛出 Exception,Sentry\init() 默认不捕获;且 set404Override() 指向的控制器方法若返回 view() 或 redirect(),也不会触发 Sentry:
- CI4 中,需在自定义 404 控制器方法里显式调用:
\Sentry\captureMessage("404 Not Found: " . current_url(), 'warning'); - CI3 中,可改写
show_404()函数,在system/core/Exceptions.php对应位置插入$client->captureMessage() - 关键点:不要依赖 “自动捕获所有 HTTP 状态码”,Sentry 只管未捕获异常和手动
captureXXX()调用 - 常见漏掉的场景:AJAX 请求返回 404、API 接口路径拼错、
base_url()配置错误导致资源加载失败——这些都得前端配合上报,后端 Sentry 看不见
最容易被忽略的是 DSN 权限粒度和环境隔离:同一个 DSN 在 dev/staging/prod 共用,会导致测试日志污染生产看板;务必用 environment 配置项区分,且 Sentry 项目设置里开启 environment filter。另外,CI3 的 Raven_Client 不支持 before_send 钩子,敏感字段过滤只能靠 setExtra() 前清洗数据,别等到上线才发现用户密码进了 Sentry。











