doctrine sql日志默认关闭,需在config/packages/dev/doctrine.yaml中配置doctrine.dbal.logging: true和profiling: true,并清缓存;日志写入var/log/dev.log,sql分析需通过web profiler查看。

Doctrine SQL 日志默认不开启,必须手动启用
Symfony 默认不会打印 SQL 查询语句,即使你在开发环境运行 doctrine:query 或访问页面,控制台和浏览器都看不到实际执行的 SQL。这不是 bug,而是 Doctrine 的默认行为——日志开关被关闭了。
关键点在于:日志开关由 doctrine.dbal.logging 控制,它只在 config/packages/doctrine.yaml(或旧版的 config_dev.yml)中生效,且仅对当前环境配置起作用。
- 确保你修改的是开发环境配置文件(如
config/packages/dev/doctrine.yaml),不是prod下的 - 不能只写
logging: true,必须嵌套在doctrine.dbal节点下 - 如果使用
.env切换环境(如APP_ENV=dev),要确认当前确实是dev环境(php -r "var_dump($_ENV['APP_ENV']);")
启用后日志输出到哪里?
启用 logging: true 后,SQL 语句不会直接打到控制台或浏览器,而是交由 Monolog 处理,默认写入 var/log/dev.log(Symfony 6+)或 app/logs/dev.log(Symfony 2.x)。你得去翻日志文件,而不是等命令行回显。
常见误区:
- 执行
php bin/console doctrine:query:sql "SELECT * FROM user"不会把 SQL 打印在终端——它只执行,不走 DBAL 日志通道 - Web 请求中的查询才会被记录,且只有在响应返回后才刷入日志文件(受 Monolog 缓冲影响)
- 日志内容包含参数绑定后的实际值(如
INSERT INTO user (name) VALUES ('alice')),但前提是没开启profiling: true的额外开销
想实时看 SQL?加 profiling: true 并配合 Web Profiler
单纯 logging: true 只记文本,不带执行时间、调用栈或参数展开。要获得可交互的 SQL 分析视图,必须同时开启 profiling: true,并确保 Web Profiler 已安装启用。
操作步骤:
- 在
config/packages/dev/doctrine.yaml中设:doctrine: dbal: logging: true profiling: true - 访问任意页面后,点击右下角 Web Profiler 小图标 → “Doctrine” 标签页 → 查看所有查询、耗时、EXPLAIN 结果
- 注意:
profiling: true有性能损耗,切勿在生产环境开启
日志里查不到 SQL?先检查这三件事
启用后仍无 SQL 输出,大概率是以下某个环节断了:
-
pdo_mysql扩展未加载(php -m | grep pdo_mysql返回空,需sudo apt install php-mysql并重启 PHP-FPM) -
DATABASE_URL指向的是localhost,导致连接走 Unix socket,而某些 PDO 配置下 socket 连接不触发日志(改用127.0.0.1或内网 DNS 名) - 缓存没清:修改 YAML 后执行
php bin/console cache:clear --env=dev,否则旧配置仍在生效
最隐蔽的坑是:Doctrine 日志依赖 Monolog 的 doctrine channel,如果项目自定义过 Monolog 配置(比如重写了 channels 或禁用了 doctrine),SQL 就会被静默丢弃——此时得检查 config/packages/dev/monolog.yaml 是否保留了 doctrine channel。











