【发布时间】:2019-05-22 14:49:21
【问题描述】:
使用 .Net Core 2.2 中的实体框架,我想将 EF 生成的所有 SQL 语句记录到 Visual Studio 中的“调试输出”窗口。
在 .Net Framework 中,我只需将这一行添加到 DbContext 构造函数中:
Database.Log = s => System.Diagnostics.Debug.WriteLine(s);
在 EF 中,我正在尝试以下操作。它编译,并且调用了 OnConfiguring 方法,但没有数据库调用记录到我的调试输出窗口。我错过了什么?
public class MyContext : DbContext
{
private ILoggerFactory GetLoggerFactory()
{
IServiceCollection serviceCollection = new ServiceCollection();
serviceCollection.AddLogging(builder => builder
.AddDebug()
.AddFilter(DbLoggerCategory.Database.Command.Name, LogLevel.Debug));
return serviceCollection.BuildServiceProvider()
.GetService<ILoggerFactory>();
}
public MyContext(DbContextOptions<MembershipContext> options) : base(options)
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseLoggerFactory(GetLoggerFactory());
}
}
我的 appsettings.json 包含以下内容:
"Logging": {
"LogLevel": {
"Default": "Debug"
}
},
我的 Startup.cs 在 ConfigureServices 方法中包含这一行:
services.AddDbContext<MyContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("MyConnectionSTring")));
Startup.cs 也包含以下答案之一,但它不会导致 EF SQL 打印到输出窗口:
public ILogger<Startup> Logger { get; set; }
public Startup(IConfiguration configuration, ILogger<Startup> logger)
{
Configuration = configuration;
Logger = logger;
//the following line gets printed to my debug output window:
logger.LogDebug("this is a debug message");
}
【问题讨论】:
-
你试过
AddConsole()吗?它不一样,但它有助于隔离问题 -
@PanagiotisKanavos 是的,我做到了。没有控制台窗口打开。可执行文件是一个 web api。当我运行它时,会使用默认的 GET 路径打开一个浏览器实例,但没有控制台窗口。
-
您打算使用哪个日志框架?您想记录确切的 SQL 语句还是只记录结构?
-
@Hermann.Gruber 我不明白这个问题(.Net Core 的新手)。我想记录 EF 生成的 sql 语句。如果我需要添加一些内容来选择日志框架,请告诉我。
标签: c# entity-framework .net-core