新增自定义ILoggerProvider实现类
public class EFLoggerProvider : ILoggerProvider
{
public ILogger CreateLogger(string categoryName) => new EFLogger(categoryName);
public void Dispose() { }
}
新增自定义日志处理接口ILogger的实现
public class EFLogger : ILogger
{
private readonly string categoryName;
public EFLogger(string categoryName) => this.categoryName = categoryName;
public bool IsEnabled(LogLevel logLevel) => true;
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) {
//ef core执行数据库查询时的categoryName为Microsoft.EntityFrameworkCore.Database.Command,日志级别为Information
if (categoryName == "Microsoft.EntityFrameworkCore.Database.Command"
&& logLevel == LogLevel.Information) {
var logContent = formatter(state, exception);
Console.WriteLine();
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine(logContent);
Console.ResetColor();
}
}
public IDisposable BeginScope<TState>(TState state) => null;
}
配置DbContext的日志记录
方式一:在DbContext下添加OnConfiguration配置
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
if (env== "Development")
{
var loggerFactory = new LoggerFactory();
loggerFactory.AddProvider(new EFLoggerProvider());
optionsBuilder.UseLoggerFactory(loggerFactory);
base.OnConfiguring(optionsBuilder);
}
}
方式二 在Host项目中配置ConfigureService中配置
services.AddDbContext<YourDbContext>(r => {
//使用ef core mysql 连接
var loggerFactory = new LoggerFactory();
loggerFactory.AddProvider(new EFLoggerProvider());
r.UseMySQL(Configuration.GetConnectionString("your db connection string"))
.UseLoggerFactory(loggerFactory);
});