答案:C#中实现数据库查询日志的核心是捕获SQL语句及执行时间,常用方法包括:1. EF6通过Database.Log记录日志;2. EF Core使用LogTo方法输出命令日志;3. Dapper需手动封装执行逻辑并结合Serilog/NLog记录;4. ADO.NET可通过封装执行方法添加日志;推荐使用Serilog、NLog或Microsoft.Extensions.Logging实现结构化日志记录。

在C#中实现数据库查询的日志记录,核心方式是通过拦截或捕获数据库操作过程中的SQL语句和执行时间。常用的技术和工具取决于你使用的数据访问方式,比如 Entity Framework、Dapper 或 ADO.NET。以下是几种常见实现方式和推荐工具。
EF6:可以通过设置 DbContext.Database.Log 属性来输出SQL日志。
示例:
context.Database.Log = message => System.Diagnostics.Debug.WriteLine(message);
也可以将日志写入文件或其他日志框架(如 NLog、Serilog)。
EF Core:使用 ILoggerFactory 注册日志服务。
示例:
optionsBuilder.UseSqlServer(connectionString) .LogTo(Console.WriteLine, LogLevel.Information);
还可以过滤只记录数据库命令:
.LogTo(Console.WriteLine, new[] { DbLoggerCategory.Database.Command.Name }, LogLevel.Information)
建议做法:创建一个包装类,在执行 SQL 前后写日志。
示例:
public async Task<ienumerable>> QueryAsync<t>(string sql, object param = null)</t></ienumerable>{
_logger.LogInformation($"Executing SQL: {sql} with params: {param}");
var result = await _connection.QueryAsync<t>(sql, param);</t>
_logger.LogInformation($"Query returned {result.Count()} results.");
return result;}
结合 Serilog 或 NLog 可以将日志结构化输出到文件、控制台或日志服务器。
ExecuteNonQuery、ExecuteReader 等方法前后添加日志代码。建议封装一个通用的数据库执行方法:
public async Task<t> ExecuteWithLoggingAsync<t>(string commandText, Func<sqlcommand task>> action)</sqlcommand></t></t>{
_logger.LogDebug($"SQL: {commandText}");
var sw = Stopwatch.StartNew();
try
{
var result = await action(cmd);
sw.Stop();
_logger.LogInformation($"SQL executed in {sw.ElapsedMilliseconds}ms");
return result;
}
catch (Exception ex)
{
_logger.LogError(ex, "SQL execution failed");
throw;
}}
例如,使用 Serilog 记录EF Core日志:
.LogTo(Log.Logger.Information, LogLevel.Information)
基本上就这些。根据你的数据访问技术选择合适的方式,关键是把SQL、参数、执行时间和异常统一记录下来,便于排查问题和性能分析。
以上就是C#中如何实现数据库查询的日志记录?使用什么工具?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号