C# 实体框架拦截器方法 C#如何使用Interceptor记录SQL-C#.Net教程

EF Core 6+ 推荐用 DbCommandInterceptor 实现 SQL 日志记录,需在 AddDbContext 配置中注册线程安全实例,重写 CommandExecuting/CommandExecuted;避免 LogTo 的语义日志局限,兼顾参数安全格式化、异步落盘与采样策略。

EF Core 中如何注册 DbCommandInterceptor 实现 SQL 日志记录

EF Core 6+ 推荐用 DbCommandInterceptor 拦截原始 SQL 执行,它比旧版的 IDbCommandTreeInterceptor 更轻量、更直接。注册必须在 DbContextOptionsBuilder 阶段完成,且拦截器实例需是线程安全的(不能带状态,或自行同步)。

常见错误:把拦截器当普通服务注入到构造函数里,或在 OnConfiguring 中重复 AddInterceptors —— 这会导致多次注册、日志重复甚至异常。

  • 在 Startup.cs 或 Program.cs 的 services.AddDbContext 配置中调用 .AddInterceptors(new SqlLoggerInterceptor())
  • 拦截器类需继承 DbCommandInterceptor,重写 CommandExecuting(同步执行前)或 CommandExecuted(执行后)
  • 若只需看 SQL,CommandExecuting 足够;若还要查耗时或结果行数,用 CommandExecuted 并检查 result 是否为 DbDataReader 或 int

CommandExecuting 中如何安全提取参数化 SQL 和参数值

EF Core 默认使用参数化查询,DbCommand.CommandText 是带 @param 的模板,DbCommand.Parameters 是 DbParameter 集合。直接拼接易出错,尤其遇到 DBNull.Value、二进制数据或日期时区问题。

别手动遍历 Parameters 拼字符串 —— 容易漏转义、类型不一致、日志格式混乱。推荐用现成工具辅助格式化。

  • 用 command.Parameters.Cast().Select(p => $"{p.ParameterName} = {p.Value ?? "NULL"}").ToArray() 快速调试,但仅限开发环境
  • 生产环境建议用 Microsoft.Data.SqlClient 的 SqlClientFactory.CreateCommand() + ToString() 行为模拟,或引入轻量库如 EFCore.SqlServer.Interceptors(非官方)做安全展开
  • 注意:p.Value 可能是 DateTimeOffset、byte[]、Guid,打印前先 ToString("O") 或 Convert.ToString() 避免 ToString() 返回空或乱码

为什么 LogTo 不够用,还得自己写拦截器

DbContextOptionsBuilder.LogTo 确实能打日志,但它输出的是 EF Core 内部语义(如 “Executing DbCommand [Parameters=[@p0=’xxx’]]”),不包含真实 SQL 文本,也不方便对接 ELK、Seq 等结构化日志系统。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » C# 实体框架拦截器方法 C#如何使用Interceptor记录SQL-C#.Net教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4010990+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4010990+
  • 本周更新: 0+
  • 最后更新: 2026-03-16