请问在 .NET Core 中如何让 Entity Framework Core 在日志中记录由 LINQ 生成的SQL语句?
2024-10-20 00:32:30
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);
}
最新文章
- 如何卸载重装docker?
- ligerDialog的使用
- 解决treeview未选中时,默认选中首个根节点的问题!
- R语言的一些笔记
- Bzoj 1648: [Usaco2006 Dec]Cow Picnic 奶牛野餐 深搜,bitset
- codeforces C. Ryouko&#39;s Memory Note
- 重装系统后搭建php环境
- [折腾纪实]JAVA的坑
- 迷宫 洛谷 p1605
- tomcat-users.xml 配置
- redis 3.2 新数据结构:quicklist、String的embstr与raw编码方式分界点
- python设计模式第六天【原型模式】
- UI与开发的必备神器!— iDoc一键适配不同平台尺寸(iDoc201902-2新功能)
- [LeetCode] 307. Range Sum Query - Mutable 解题思路
- 用CSS画基本图形
- L312 难看懂的
- ace admin
- Solr搜索结果说明 (转)
- javascript读取xml文件读取节点数据的例子
- [django] Deploy Django Applications Using uWSGI and Nginx on Ubuntu 14.04
热门文章
- Docker版zabbix
- Ueditor 自动设置上传图片的宽度或高度
- 一些坑 Java 执行命令行命令 Spring Boot 打包为jar ResourceUtils.getFile 等出现的问题
- discuz x3.3门户出现关键词和描述显示“首页”的解决方法
- python连接redis哨兵集群
- MapTask工作机制
- 装饰器vue-property-decorator
- spring:过滤器和拦截器
- Linux中tune2fs命令的-o选项
- 网络命令——write、wall、ping、ifconfig、mail