记录 SQL 查询参数值

4

我使用nlog,并采用以下设置记录SQL查询:

<logger name="Microsoft.EntityFrameworkCore.*" 
        minlevel="Trace" writeTo="sqllogfile" final="true" />

它按预期工作,但不记录参数值,查询看起来像这样:

2017-07-31 13:49:03.8836|  INFO  |Microsoft.EntityFrameworkCore.Internal.InterceptingLogger`1.Log|Executed DbCommand (8ms) [Parameters=[@__get_Item_0='?' (Size = 450)], CommandType='Text', CommandTimeout='30']
SELECT TOP(1) [e].[Id], [e].[AccessFailedCount], [e].[ConcurrencyStamp], [e].[Email], [e].[EmailConfirmed], [e].[HeliosLoginId], [e].[LockoutEnabled], [e].[LockoutEnd], [e].[Name], [e].[NormalizedEmail], [e].[NormalizedUserName], [e].[PasswordHash], [e].[PhoneNumber], [e].[PhoneNumberConfirmed], [e].[SecurityStamp], [e].[TwoFactorEnabled], [e].[UserName]
FROM [AspNetUsers] AS [e]
WHERE [e].[Id] = @__get_Item_0 

是否可以显示@__get_Item_0参数的值?

谢谢


1
在你的 DbContextOptionsBuilder 上调用 EnableSensitiveDataLogging 方法。因为值可能包含敏感数据,所以 EF Core 默认不记录值。 - Smit
@Smit 我认为这是一个答案,随时可以再次发布。谢谢。 - myro
1个回答

13

默认情况下,EF Core 在记录日志时隐藏了 SQL 中的数据。查询可能包含各种数据,其中一些可能是敏感信息(例如客户的社会安全号码或信用卡信息)。因此,日志中使用 ? 代替实际值。

尽管有时开发人员希望查看这些值,特别是在调试困难 bug 时。要启用记录实际值,需要配置您的 dbcontext。

您需要在 DbContextOptionsBuilder 上调用 EnableSensitiveDataLogging()。由于有多种配置 db context 选项的方式,最简单的方法是在配置提供程序的连接字符串时获取它(例如 UseSqlServer),然后就可以将其链接在它之后了。

示例:

optionsBuilder
    .UseSqlServer("connectionstring")
    .EnableSensitiveDataLogging();

1
EF6有类似的配置选项吗? - pingOfDoom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接