sentry symfony sdk 默认不捕获translation缺失或格式错误,需手动监听translationfailureevent或启用strict_mode并配置事件监听器;dsn配置失效表现为sentry:test报空dsn错误或静默失败,须检查.env中sentry_dsn定义、sentry.yaml占位符及容器环境变量解析。

直接上结论:Sentry Symfony SDK 能自动捕获未捕获异常、PHP 错误和 Symfony 事件异常,但默认不监控 Translation 缺失或格式错误——这类问题必须手动监听 TranslationFailureEvent 或拦截 kernel.exception 才能上报。
DSN 配置失效的典型表现与修复
常见错误现象:php bin/console sentry:test 报错 Invalid DSN: empty string 或静默失败无事件;SENTRY_DSN 在 .env 中写错位置(比如漏掉 APP_ 前缀却在配置里用 %env(APP_SENTRY_DSN)%)也会导致空值。
- 确保
.env文件中定义的是SENTRY_DSN=...,且值非空、无前后空格 - 检查
config/packages/sentry.yaml是否用了正确占位符:dsn: '%env(SENTRY_DSN)%',不是%env(resolve:SENTRY_DSN)%(后者仅用于路径类变量) - 运行
php bin/console debug:container --parameter=env(SENTRY_DSN)确认环境变量是否被正确解析 - 若用 Docker,确认
SENTRY_DSN已通过environment:或env_file:显式注入容器
Translation 错误为什么不上报?
Symfony 的 Translator 默认遇到缺失翻译时只返回原字符串(如 app.welcome),不抛异常;只有启用 strict_mode 或显式调用 trans() 时触发 TranslationFailureEvent,才可能被捕获。
- 在
config/packages/translation.yaml中开启严格模式:strict_mode: true,这样缺失翻译会抛出InvalidArgumentException - 注册监听器捕获
TranslationFailureEvent,而非依赖全局异常处理器——因为该事件不是Exception,不会进kernel.exception - 监听器中调用
$this->hub->captureMessage()而非captureException(),避免类型不匹配报错 - 注意:Twig 模板里用
{{ 'app.welcome'|trans }}不会触发TranslationFailureEvent,需改用{{ 'app.welcome'|trans({}, 'messages', app.request.locale) }}并确保 locale 可控
性能追踪(tracing)启用后没数据?
启用 tracing.enabled: true 只是开关,真正产生 span 还得靠具体集成点。DBAL、HTTP Client、Cache 等追踪默认关闭,且依赖对应组件已安装并被 Symfony 正确识别。
- 确认已安装
symfony/doctrine-bridge(DBAL)、symfony/http-client(HTTP)、symfony/cache(Cache) - 检查
config/packages/sentry.yaml中子配置是否对齐:dbal: enabled: true,不是doctrine: enabled: true - HTTP 客户端追踪只对
Symfony\Contracts\HttpClient\HttpClientInterface实例生效,原生cURL或GuzzleHttp\Client不会被自动包裹 - 若用 Doctrine ORM,DBAL 追踪需确保实体管理器使用的是 Symfony 自动配置的连接,自定义
Connection类可能绕过追踪逻辑
Monolog 日志怎么同步到 Sentry?
很多人以为配了 Sentry 就能收所有日志,其实默认只收 error 及以上级别,且需显式启用 Monolog 集成,否则 logger->error() 不会发事件。
- 在
sentry.yaml中添加:monolog: enabled: true - 确保
monolog包已安装:composer require monolog/monolog - 若用自定义
LoggerInterface实例(比如注入logger.app),需确认该 channel 已绑定到 Sentry handler;可通过debug:container logger查看服务定义 - 敏感字段如
password、token会默认被过滤,但自定义上下文中的数组键名若含这些词,也可能被清空——这不是 bug,是 SDK 内置的 PII 过滤策略
最容易被忽略的一点:Sentry 的采样率(sample_rate)默认是 1.0,但在高流量项目中,没人改它就等于把所有错误都打过去,很快触发配额超限。上线前务必设为 0.1 或更低,并搭配 ignore_exceptions 过滤掉已知无关异常(比如 NotFoundHttpException)。










