You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用EF Core与Log4net记录SQL查询至日志文件遇问题求助

排查.NET Core EF 3.1 + log4net SQL日志为空的问题

我帮你梳理几个最可能遗漏的关键点,你可以逐一排查:

1. 确保log4net配置文件被正确加载并复制到输出目录

  • 首先,要保证你的log4net.config文件的复制到输出目录属性设置正确:右键文件 → 属性 → 复制到输出目录 → 选择「如果较新则复制」或者「始终复制」,不然运行时程序找不到配置文件。
  • 在.NET Core中,还需要确保在日志配置中正确引入log4net,比如在Program.cs里:
    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureLogging(logging =>
            {
                logging.ClearProviders(); // 清除默认日志提供器,避免冲突
                logging.AddLog4Net(); // 添加log4net提供器
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
    

2. 配置EF Core的日志级别,确保SQL日志不被过滤

EF Core的SQL命令日志默认是Debug级别,但.NET Core默认会过滤掉Microsoft前缀的Debug日志。你需要在appsettings.json中明确开启EF Core的Debug日志:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.EntityFrameworkCore": "Debug" // 必须设置这一行,让EF的SQL日志能被捕获
    }
  }
}

3. 完善log4net配置,关联EF的特定Logger到Appender

你的log4net配置里只定义了Appender,但没有把它关联到EF Core的SQL日志Logger。EF的SQL命令日志来自Microsoft.EntityFrameworkCore.Database.Command这个Logger名称,你需要在log4net配置中添加对应的Logger节点:

<!-- 根Logger配置(可选,如果你想捕获所有Debug日志) -->
<root>
  <level value="DEBUG" />
  <appender-ref ref="logger" />
</root>

<!-- 或者只针对EF的SQL日志配置,更精准 -->
<logger name="Microsoft.EntityFrameworkCore.Database.Command" additivity="false">
  <level value="DEBUG" />
  <appender-ref ref="logger" />
</logger>

如果没有这个关联,即使有日志产生,也不会输出到你的文件Appender里。

4. 确认DBContext的LoggerFactory注入正确

检查你的DBContext构造函数是否正确注入了ILoggerFactory:

public YourDbContext(DbContextOptions<YourDbContext> options, ILoggerFactory loggerFactory)
    : base(options)
{
    _loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
}

另外,推荐在Startup.cs的ConfigureServices中直接配置DbContext时指定LoggerFactory,这样更可靠:

services.AddDbContext<YourDbContext>(options =>
    options.UseSqlServer(Configuration.GetConnectionString("YourConnectionString"))
           .UseLoggerFactory(_loggerFactory));

5. 验证log4net的Filter配置

你的Filter设置只允许DEBUG级别,这和EF SQL日志的级别匹配,但如果前面的步骤没做好,日志根本不会到达log4net的Filter环节。可以先暂时注释掉Filter配置,测试是否有日志输出,再逐步调试。

内容的提问来源于stack exchange,提问作者Steve Cold

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 21:37:37