dev.log 看不到路由匹配过程是因为 symfony2 默认不记录 debug 级别的路由日志,且 dev 环境需显式启用 request 通道、配置 monolog.logger.request 并确保未排除 router 通道。

为什么 dev.log 里看不到路由匹配过程
因为 Symfony2 默认不记录路由解析细节,dev.log 只收 error/warning 级别日志,而路由匹配属于 debug 级别,且默认未启用对应通道。你看到空文件或只有 PHP 错误,不是配置失效,而是日志等级和通道没对上。
- 检查
config/packages/dev/monolog.yaml是否包含channels: ['!event']—— 如果误把router通道排除了,debug级路由日志就直接被过滤掉 -
RouterListener的日志走的是request通道,不是main或doctrine,必须显式放开:在 handlers 下加channels: ['request'] - 确保环境是
dev,prod下即使配置正确也不会写 debug 日志
用 RouterListener + LoggerInterface 抓取完整匹配路径
最稳的方式是在请求生命周期早期介入,拿到原始 $request 和最终解析出的 _route、_controller、_route_params。不要等进控制器再记——那时路由早已完成,上下文可能被覆盖。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 创建一个轻量事件监听器,监听
kernel.request优先级设为32(比RouterListener的32相同或略高),确保能读到刚塞进去的属性 - 注入
LoggerInterface并指定通道:monolog.logger.request,避免混入其他日志流 - 关键字段要全取:
$request->attributes->get('_route')、$request->attributes->get('_controller')、$request->getPathInfo()、$request->getMethod() - 别只记 route 名:加上
$request->getHost()和$request->getPort(),否则无法区分子域名或非标端口下的路径歧义
调试时绕过日志文件直看终端输出
改配置、等轮转、查文件太慢,开发阶段建议用 dump() + 控制台实时抓取,尤其适合验证路由是否真被识别。
- 在任意控制器方法开头加:
dump($this->get('request_stack')->getCurrentRequest()->getAttributes()) - 如果
_route是null,说明路由根本没匹配上,问题在config/routes.yaml或routing.yml的 path 写法(比如漏了/开头、用了{id}却没定义 requirement) - 搭配
php bin/console debug:router输出全部注册路由,确认目标 path 是否在列表中、methods 是否匹配、host 是否受限 - 注意:
dump()在 CLI 模式下会输出到终端,在 Web 模式下走 WebProfiler —— 如果页面没弹出 profiler 工具栏,说明web_profiler没启用或环境不是dev
生产环境不能开 debug 日志?那就用 Profiler API 抽取路由快照
线上不能开 full debug,但你可以让 Profiler 在每次请求后自动存一份轻量路由元数据,供事后回溯。
- 启用 profiler 存储:
framework.profiler.only_exceptions: false,并确保profiler.storage.dsn指向可写的目录或 DB 表 - 路由信息存在
data['request']['attributes']和data['router']['matched_route']中,可用命令提取:php bin/console profiler:export --limit=10 --format=json 'routed' | jq '.[0].data.router.matched_route' - 关键点:Profiler 默认只存最后 50 个请求,高频服务需调大
framework.profiler.lifetime,否则刚想查就已被覆盖 - 如果发现某路径总显示
kernel.root_controller而不是你的 controller 名,说明路由 fallback 到了默认处理逻辑,大概率是defaults配置缺失或controller值拼错
dev.log 或等 profiler 页面加载,容易错过中间态。真正要抓“完整路径”,得盯住 request.attributes 这个容器,而不是只看最终渲染结果。










