请问在 .NET Core 中如何让 Entity Framework Core 在日志中记录由 LINQ 生成的SQL语句?


using dotNET.Core;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text; namespace dotNET.EFCoreRepository
{
/// <summary>
/// ef 日志
/// </summary>
public class EFLoggerProvider : ILoggerProvider
{
public ILogger CreateLogger(string categoryName) => new EFLogger(categoryName);
public void Dispose() { }
} /// <summary>
///
/// </summary>
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);
NLogger.Debug(logContent);
//TraceMessage("Something happened.");
// NLogger.Info(GetCodeLineAndFileName());
//TODO: 拿到日志内容想怎么玩就怎么玩吧
Console.WriteLine();
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine(logContent);
Console.ResetColor();
}
} public IDisposable BeginScope<TState>(TState state) => null; public void TraceMessage(string message,
[System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
[System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
[System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = )
{
NLogger.Debug("message: " + message);
NLogger.Debug("member name: " + memberName);
NLogger.Debug("source file path: " + sourceFilePath);
NLogger.Debug("source line number: " + sourceLineNumber);
} public string GetCodeLineAndFileName()
{
StackTrace insStackTrace = new StackTrace(true);
var insStackFrames = insStackTrace.GetFrames();
string str = "";
foreach(var insStackFrame in insStackFrames)
{
str += String.Format("\nFile: {0}, Line: {1}\n", insStackFrame.GetFileName(), insStackFrame.GetFileLineNumber());
}
return str;
} }
}

第一步: 添加日志类

第二步:OnConfiguring  方法添加日志调用

   protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var loggerFactory = new LoggerFactory();
loggerFactory.AddProvider(new EFLoggerProvider());
optionsBuilder.UseLoggerFactory(loggerFactory);
base.OnConfiguring(optionsBuilder);
}
上一篇:分享几套不一样的博客园皮肤 ?


下一篇:setsockopt与getsockopt