EF Core 6+ 直接调用 LogTo(Console.WriteLine) 即可输出 SQL 到控制台,但需配合 EnableSensitiveDataLogging(true) 才显示实际参数值,且仅限开发环境使用。

EF Core 6+ 怎么用 LogTo 打印 SQL 到控制台
直接在 DbContext 配置时调用 LogTo,传入 Console.WriteLine 就行,不用额外装包、不用改日志框架。
常见错误是只加了 LogTo 却没开 Microsoft.EntityFrameworkCore.Database.Command 级别日志,结果控制台啥也不输出。
-
LogTo必须在UseSqlServer(或其它 provider)之后链式调用,顺序反了无效 - 默认只输出参数化 SQL,不展开参数值;想看实际执行的完整语句(含值),得额外配
options.EnableSensitiveDataLogging(true) - 敏感数据开关仅影响日志内容,不影响 SQL 执行逻辑或安全性
services.AddDbContext<AppDbContext>(options =>
{
options.UseSqlServer(connectionString)
.LogTo(Console.WriteLine, new[] {
Microsoft.Extensions.Logging.LogLevel.Information
})
.EnableSensitiveDataLogging(true);
});
为什么 LogTo 不打印 INSERT/UPDATE 的参数值
因为 EF Core 默认把参数当敏感数据处理,即使开了 Information 级别,参数占位符(如 @p0)后面也不会显示对应值。
典型现象:看到 INSERT INTO Users (Name) VALUES (@p0),但不知道 @p0 具体是 “张三” 还是 null。
- 必须显式调用
EnableSensitiveDataLogging(true),且它要放在LogTo之前或之后都行,但必须在同一options链里 - 该设置只影响日志,不改变生成的 SQL 或执行行为
- 生产环境严禁开启,否则密码、token 等可能被记入日志
EF Core 5 及更早版本没有 LogTo 怎么办
用 ConfigureWarnings + Log 回调替代,但写法稍啰嗦,且默认不输出参数值 —— 即使开了敏感数据,也得手动拼接。
更稳妥的做法是降级到 Microsoft.Extensions.Logging.Console 并配置日志过滤器:
- 在
Program.cs中添加builder.Logging.AddConsole() - 在
appsettings.Development.json里加日志级别配置:"Microsoft.EntityFrameworkCore.Database.Command": "Information" - 仍需
EnableSensitiveDataLogging(true)才能看到参数值
控制台刷屏太快,SQL 日志被滚走怎么办
不是 EF Core 的问题,是终端缓冲区限制。Windows Terminal、VS 内置终端、PowerShell 默认只存几百行,大量查询一跑就顶掉前面的 SQL。
- 临时方案:在运行前右键终端标题栏 → 属性 → 布局 → 屏幕缓冲区大小 → 行数调到 9999
- 长期方案:把日志重定向到文件,用
LogTo(File.AppendAllText, ...)或第三方日志库 - 调试时建议配合断点 +
Database.GenerateCreateScript()查建表语句,比翻日志更快
敏感数据开关和日志级别必须同时生效才看得见带值的 SQL,漏一个就只能看到占位符。很多人卡在这一步,反复检查 LogTo 位置却忘了开敏感模式。


















