我在MVC 5项目中使用EF 6.0和LINQ。我想记录所有由实体框架DbContext执行的SQL查询,用于调试/性能测量目的。在Java/Hibernate中,通过设置属性hibernate.show_sql=true可以实现等效的行为。在Entity Framework中是否可能有类似的行为?
hibernate.show_sql=true
uubf1zoe1#
MSDN上的Logging and Intercepting Database Operations文章是您正在寻找的。DbContext.Database.Log属性可以设定为任何接受字串之方法的委派。最常见的是将它设定为TextWriter的“Write”方法,以搭配任何TextWriter使用。目前内容所产生的所有SQL都会记录到该写入器。例如,下列程式码会将SQL记录到主控台:
DbContext.Database.Log
TextWriter
using (var context = new BlogContext()) { context.Database.Log = s => System.Diagnostics.Debug.WriteLine(s); // Your code here... }
2022年更新:在ef core的开发中,日志记录现在默认启用。可以在DB Context的构建器中配置该行为(启用敏感数据日志记录以记录查询参数值或指定要记录的事件):
services.AddDbContext<IDbContext, ApplicationDbContext>( options => options.UseSqlServer(dbConnectionString) .LogTo(s => System.Diagnostics.Debug.WriteLine(s)) .EnableDetailedErrors(isDebugMode) .EnableSensitiveDataLogging(isDebugMode));
或者您可以使用app.settings文件为您感兴趣的事件定义日志配置
46qrfjad2#
您可以使用此行将SQL查询只记录到Visual Studio的“输出”窗口中,而不记录到控制台窗口中,同样,也只能在调试模式下记录。
public class YourContext : DbContext { public YourContext() { Database.Log = sql => Debug.Write(sql); } }
tpxzln5u3#
如果您有一个带有记录器的.NET Core安装程序,那么EF会将其查询记录到您想要的任何输出中:调试输出窗口、控制台、文件等您只需要在appsettings中配置“Information”日志级别。例如,这将EF日志记录到调试输出窗口:
"Logging": { "PathFormat": "Logs/log-{Date}.txt", "IncludeScopes": false, "Debug": { "LogLevel": { "Default": "Information", "System": "Information", "Microsoft": "Information" } }, "Console": { "LogLevel": { "Default": "Information", "System": "Warning", "Microsoft": "Warning" } }, "File": { "LogLevel": { "Default": "Information", "System": "Warning", "Microsoft": "Warning" } }, "LogLevel": { "Default": "Information", "System": "Warning", "Microsoft": "Warning" } }
nszi6y054#
EF Core日志记录自动与.NET Core的日志记录机制集成。如何使用它记录到控制台的示例:
public class SchoolContext : DbContext { //static LoggerFactory object public static readonly ILoggerFactory loggerFactory = new LoggerFactory(new[] { new ConsoleLoggerProvider((_, __) => true, true) }); //or // public static readonly ILoggerFactory loggerFactory = new LoggerFactory().AddConsole((_,___) => true); public SchoolContext():base() { } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseLoggerFactory(loggerFactory) //tie-up DbContext with LoggerFactory object .EnableSensitiveDataLogging() .UseSqlServer(@"Server=.\SQLEXPRESS;Database=SchoolDB;Trusted_Connection=True;"); } public DbSet<Student> Students { get; set; } }
如果要记录到输出窗口,请改用以下命令:
public static readonly ILoggerFactory loggerFactory = new LoggerFactory(new[] { new DebugLoggerProvider() });
https://www.entityframeworktutorial.net/efcore/logging-in-entityframework-core.aspx
qacovj5a5#
如果有人正在使用EF6.1+,有一个简单的方法。查看以下链接了解更多详细信息。https://learn.microsoft.com/en-us/ef/ef6/fundamentals/configuring/config-file#interceptors-ef61-onwards示例代码
<interceptors> <interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework"> <parameters> <parameter value="C:\Stuff\LogOutput.txt"/> <parameter value="true" type="System.Boolean"/> </parameters> </interceptor> </interceptors>
sulc1iza6#
从this article开始创建工厂并设置过滤器。
var loggerFactory = LoggerFactory.Create(builder => { builder .AddConsole((options) => { }) .AddFilter((category, level) => category == DbLoggerCategory.Database.Command.Name && level == LogLevel.Information); });
告诉DbContext使用OnConfiguring方法中的工厂:
optionsBuilder.UseLoggerFactory(_loggerFactory);
sirbozc57#
使用附加行覆盖YourDbContext中的OnConfiguring方法:
YourDbContext
OnConfiguring
public class YourContext : DbContext { protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.LogTo(Console.WriteLine); } }
7条答案
按热度按时间uubf1zoe1#
MSDN上的Logging and Intercepting Database Operations文章是您正在寻找的。
DbContext.Database.Log
属性可以设定为任何接受字串之方法的委派。最常见的是将它设定为TextWriter的“Write”方法,以搭配任何TextWriter
使用。目前内容所产生的所有SQL都会记录到该写入器。例如,下列程式码会将SQL记录到主控台:2022年更新:在ef core的开发中,日志记录现在默认启用。可以在DB Context的构建器中配置该行为(启用敏感数据日志记录以记录查询参数值或指定要记录的事件):
或者您可以使用app.settings文件为您感兴趣的事件定义日志配置
46qrfjad2#
您可以使用此行将SQL查询只记录到Visual Studio的“输出”窗口中,而不记录到控制台窗口中,同样,也只能在调试模式下记录。
tpxzln5u3#
如果您有一个带有记录器的.NET Core安装程序,那么EF会将其查询记录到您想要的任何输出中:调试输出窗口、控制台、文件等
您只需要在appsettings中配置“Information”日志级别。例如,这将EF日志记录到调试输出窗口:
nszi6y054#
EF Core日志记录自动与.NET Core的日志记录机制集成。如何使用它记录到控制台的示例:
如果要记录到输出窗口,请改用以下命令:
https://www.entityframeworktutorial.net/efcore/logging-in-entityframework-core.aspx
qacovj5a5#
如果有人正在使用EF6.1+,有一个简单的方法。查看以下链接了解更多详细信息。
https://learn.microsoft.com/en-us/ef/ef6/fundamentals/configuring/config-file#interceptors-ef61-onwards
示例代码
sulc1iza6#
实体框架核心3
从this article开始
创建工厂并设置过滤器。
告诉DbContext使用OnConfiguring方法中的工厂:
sirbozc57#
实体框架核心5及更高版本
使用附加行覆盖
YourDbContext
中的OnConfiguring
方法: