为何通过Eloquent执行的MSSQL查询未在事件会话中记录?
排查MSSQL事件会话无法捕获Laravel查询的问题
以下是可能的原因及对应解决思路:
1. 事件会话的事件配置不全或筛选过严
- 检查QueryMonitor事件会话是否添加了
sql_statement_completed、batch_completed这类核心查询事件。默认的QueryMonitor模板可能仅包含遥测类事件,并未开启实际SQL语句的捕获。 - 检查会话的筛选条件:比如是否限定了特定数据库、登录名或应用程序名称。Laravel连接MSSQL时,默认应用程序名称可能不是你预期的值,导致查询被过滤。可以先移除所有筛选条件测试。
2. 事件会话的文件目标配置错误
- 确认Docker Compose中是否正确挂载了MSSQL的日志目录(默认容器内路径为
/var/opt/mssql/log)到宿主机。如果路径映射错误,你在宿主机查看的QueryMonitor.xel可能不是容器内实际写入的文件。 - 检查事件会话的
max_file_size和max_rollover_files设置:如果文件达到上限且未自动滚动,新的查询不会被记录。
3. Laravel端的查询未实际发送到数据库
- 先在Tinker中验证查询是否真的执行:执行
DB::enableQueryLog()后再运行你的查询,然后用DB::getQueryLog()查看Laravel生成的SQL。如果日志为空,说明查询被缓存或没有匹配数据。 - 确认
whereNull('parent_id')是否能匹配到数据:如果结果集为空,MSSQL不会产生查询执行记录。可以先打印$records确认是否有数据返回。
4. 权限或会话上下文不匹配
- 检查创建事件会话的用户是否拥有
ALTER ANY EVENT SESSION权限,权限不足会导致事件会话无法正常捕获事件。 - 确认Laravel连接数据库的用户是否在事件会话的监控范围内:如果会话仅监控特定登录用户,而Laravel使用的是其他用户,查询不会被记录。
5. 容器内文件权限问题
- 进入MSSQL容器(
docker exec -it <你的容器名> bash),直接查看/var/opt/mssql/log下的QueryMonitor.xel文件,确认是否有查询记录。如果容器内文件有记录但宿主机看不到,说明挂载的目录权限配置错误。
内容的提问来源于stack exchange,提问作者Dimitrios Desyllas
相关产品推荐
相关产品推荐

