用途:该技能针对 Symfony 应用上线后的可观测性,规范应用输出什么日志以及如何组织日志结构,关注通道、级别、处理器、脱敏、告警与健康检查;日志最终去往何处属于基础设施范畴,不在范围内。
主要能力:
- 日志级别:依据 ErrorListener::resolveLogLevel(),非 HttpExceptionInterface 或状态码≥500 记 critical,4xx 记 error,带 #[WithLogLevel] 的异常按属性级别,framework.exceptions 中的 log_level 优先级更高。
- 通道:Symfony 自带 doctrine、messenger、request 等通道,可通过 monolog.channels 添加自定义通道。注入通道日志有四种方式,推荐 #[WithMonologChannel('business')],#[Target('business')] 或 #[Autowire(service: 'monolog.logger.business')] 出错会在编译期报错,而 #[WithMonologChannel] 拼写错误会静默创建通道。
- fingers_crossed:生产环境会缓冲日志直到达到 action_level 才整体刷新,因此成功请求不写日志,info 调用在生产环境不出现;失败时会一次性输出缓冲记录,可能包含绑定的参数值。
- 关联 ID:由 holder 服务(实现 ResetInterface)、Monolog 处理器与 Messenger 中间件组成,使一次用户动作跨进程的日志可串联。
- 脱敏:用低优先级处理器在插值前脱敏,密码、令牌、密钥、会话 ID、卡号等不应入日志。context 数组存储数据,避免拼进消息字符串;注意 doctrine.dbal.logging 在生产默认关闭。
- Messenger 失败告警:框架已记录 messenger.CRITICAL,可加 #[AsEventListener] 监听 WorkerMessageFailedEvent 并检查 willRetry()。告警接收端不应走 Messenger,可用 slackwebhook、error_log、Sentry 或 stderr,并用 fallbackgroup 包装第三方接收端。
- 健康检查:测试依赖连接而非固定返回 200,使用 getDummySelectSQL() 保持可移植,借助 #[AutoconfigureTag] 与 #[AutowireLocator] 收集检查,失败时返回 503。
- 错误追踪:Sentry 等可分组异常、标记发布版本;以 Monolog 处理器方式在 level: critical 集成,避免发送已被标记为预期的异常。
使用方式与限制:需按 Symfony、Monolog 及 monolog-bundle 版本使用相应特性,例如 #[WithMonologChannel] 需 Monolog 3.5 + monolog-bundle 3.9,#[AsMonologProcessor] 需 monolog-bundle 3.8+。具体配置、处理器代码、告警与健康检查的完整实现见 references/monolog.md、references/sensitive-data.md、references/alerting.md。部分命令与代码原文保留,未提供的收费或价格信息暂未提供。