当前位置:Gxlcms >
数据库问题 >
请问在 .NET Core 中如何让 Entity Framework Core 在日志中记录由 LINQ 生成的SQL语句?
请问在 .NET Core 中如何让 Entity Framework Core 在日志中记录由 LINQ 生成的SQL语句?
时间:2021-07-01 10:21:17
帮助过:60人阅读
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 =
0)
{
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);
}
请问在 .NET Core 中如何让 Entity Framework Core 在日志中记录由 LINQ 生成的SQL语句?
标签:work reac 方法 ado err nss system his orm