【EFCore】日誌記錄執行的SQL語句

EF Core 3.1

1.新建EFCoreLogger類,繼承ILogger

public class EFCoreLogger : ILogger
{
    private readonly string categoryName;

    public EFCoreLogger(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執行SQL語句時的categoryName爲Microsoft.EntityFrameworkCore.Database.Command,日誌級別爲Information
        if (categoryName == "Microsoft.EntityFrameworkCore.Database.Command" && logLevel == LogLevel.Information)
        {
            var logContent = formatter(state, exception);
            //寫入文本中
            LogHelper.Log("SqlLog", "【SQL語句】:" + logContent);
        }
    }

    public IDisposable BeginScope<TState>(TState state) => null;
}

2.新建EFCoreLoggerProvider,繼承ILoggerProvider

public class EFCoreLoggerProvider : ILoggerProvider
{
    public ILogger CreateLogger(string categoryName) => new EFCoreLogger(categoryName);
    public void Dispose() { }
}

3.在DbContext的OnConfiguring方法,設置日誌寫入

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    var loggerFactory = new LoggerFactory();
    loggerFactory.AddProvider(new EFCoreLoggerProvider());

    optionsBuilder.UseSqlServer(ConnectionString).UseLoggerFactory(loggerFactory);
}

看看,效果

成功了,但是,參數都是?,添加EnableSensitiveDataLogging即可,啓用敏感數據記錄

 optionsBuilder.UseSqlServer(ConnectionString).UseLoggerFactory(loggerFactory).EnableSensitiveDataLogging();

現在參數了

 

參考:

https://docs.microsoft.com/zh-cn/ef/core/miscellaneous/logging?tabs=v3

https://docs.microsoft.com/zh-cn/archive/msdn-magazine/2018/october/data-points-logging-sql-and-change-tracking-events-in-ef-core

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章