如何将Laravel的错误日志集成到Sentry或Flare? (第三方服务)

13次阅读

直接修改 config/Logging.php 即可对接 sentry,将 ‘sentry’ 加入 stack 的 channels 数组;Flare 需手动在 Handler::report() 中调用 Flare::report() 并配置 context;两者均需注意环境变量与采样率设置。

如何将Laravel的错误日志集成到Sentry或Flare? (第三方服务)

直接改 config/logging.php 就能对接 Sentry

默认 laravel 日志通道是 stack,它本身支持多通道写入。Sentry 官方维护的 sentry-laravel 包会自动注册一个 sentry 日志通道,你只需把它加进 stackchannels 数组里,错误日志就会同时写入本地文件和 Sentry。

操作步骤:

  • 运行 composer require sentry/sentry-laravel
  • 执行 php artisan sentry:publish --dsn=https://xxx@o123.ingest.sentry.io/456(替换为你的 DSN)
  • 打开 config/logging.php,找到 'stack' 通道,把 'sentry' 加进 'channels' 数组里
'stack' => [         'driver' => 'stack',         'channels' => ['single', 'sentry'], // ← 这里加一行         'ignore_exceptions' => false,     ],

注意:Laravel 9+ 默认启用了 ignore_exceptions => false,但老版本可能为 true,务必确认设为 false,否则异常不会触发日志通道。

flare-php-sdk 不走日志通道,要手动绑定异常处理器

Flare 的 SDK(flareapp/io)不提供标准日志通道,而是通过 Laravel 的异常处理机制注入。它会在 AppExceptionsHandler 中拦截未捕获异常,并上报到 Flare 后台。

关键点:

  • 安装后需在 app/Exceptions/Handler.phpreport() 方法里调用 Flare::report()
  • 不能只依赖 Log::Error() —— Flare 不监听日志,只监听 report() 流程
  • 确保 APP_DEBUG=false,否则 Flare 默认跳过上报(开发环境可手动开启)
use FlareClientFlare;  public function report(Throwable $exception) {     Flare::report($exception);      parent::report($exception); }

如果项目已重写 report(),别忘了保留 parent::report($exception),否则本地日志会丢失。

Sentry 和 Flare 对 context 的处理差异很大

两者都支持传额外上下文数据,但方式不同,容易漏传或格式错乱:

  • Sentry 接收的是扁平键值对,比如 ['user_id' => 123, 'order_status' => 'pending'],会直接显示在事件详情页的 “Context” 标签页
  • Flare 要求用 context() 方法链式添加,且只接受字符串或数组,不支持对象;传对象会报错或静默丢弃
  • 日志中用 Log::error('msg', $context),Sentry 会自动提取;Flare 不响应这个调用,必须显式调用 Flare::context()

例如想上报当前用户 ID:

// Sentry:自动带入(只要用了 Log::error) Log::error('Payment failed', ['user_id' => auth()->id()]);  // Flare:必须手动塞 Flare::context(['user_id' => (int) auth()->id()]);

别忽略 APP_ENV 和采样率配置

两个服务都默认在 local 环境下禁用上报,但逻辑不同:

  • Sentry 依赖 SENTRY_ENVIRONMENT 环境变量,若没设,默认用 APP_ENV;但若 APP_ENV=local,Sentry SDK 会直接跳过发送
  • Flare 默认只在 production 上报,且可通过 FLARE_REPORTING_ENABLED 强制开关;开发时临时调试建议设为 true
  • 高流量项目记得配采样率,Sentry 用 traces_sample_rate,Flare 用 reporting_sampling_rate,否则日志量爆炸还收费

最容易被忽略的是:Laravel 的 APP_ENV=staging 在 Sentry 中不会自动识别为生产环境,得显式设置 SENTRY_ENVIRONMENT=staging 并在 Sentry 控制台配置对应环境告警规则。

text=ZqhQzanResources