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

.NET Core 5中Serilog与Microsoft.Extensions.Logging引用歧义问题求助

问题描述

在.NET Core 5.0环境中集成Serilog时,注入ILogger<CommissionController>时出现引用歧义错误。已按照相关指引在Host构建器中添加.UseSerilog(),安装了指定NuGet包,并在DI容器中注册了Log.Logger,但问题仍未解决。

已安装的NuGet包

<PackageReference Include="Microsoft.Extensions.Logging" Version="5.0.0" />
<PackageReference Include="Serilog" Version="2.12.0" />
<PackageReference Include="Serilog.AspNetCore" Version="6.1.0" />
<PackageReference Include="Serilog.Extensions.Logging" Version="3.1.0" />
<PackageReference Include="Serilog.Settings.Configuration" Version="3.4.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" />
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />

相关代码

Program.cs

public static void Main(string[] args)
{
    var config = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json")
        .Build();

    Log.Logger = new LoggerConfiguration()
        .ReadFrom.Configuration(config)
        .CreateLogger();

    var host = CreateHostBuilder(args).Build();         

    host.Run();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        })
        .UseSerilog();

DI注册(Startup.cs)

services.AddSingleton(Log.Logger);

CommissionController

public class CommissionController : ControllerBase
{
    private readonly IMediator _mediator;
    private readonly ILogger _logger;

    public CommissionController(IMediator mediator, ILogger<CommissionController> logger)
    {
        _mediator = mediator;
        _logger = logger;
    }
    // ...
}
解决方案

1. 明确ILogger的命名空间

歧义核心是代码中同时引入了Microsoft.Extensions.Logging.ILogger和Serilog.ILogger同名接口。可以直接在Controller中指定完整命名空间,或确保文件顶部只保留需要的using语句:

修改Controller代码:

private readonly Microsoft.Extensions.Logging.ILogger _logger;

public CommissionController(IMediator mediator, Microsoft.Extensions.Logging.ILogger<CommissionController> logger)
{
    _mediator = mediator;
    _logger = logger;
}

或在文件顶部调整using:

using Microsoft.Extensions.Logging;
// 移除或注释掉 using Serilog; (如果存在)

2. 移除多余的DI注册

使用.UseSerilog()时,Serilog已自动替换Microsoft.Extensions.Logging的默认日志实现,无需手动注册Log.Logger到DI容器。删除services.AddSingleton(Log.Logger);即可避免冲突。

3. 修正NuGet包版本兼容性

当前安装的Serilog.AspNetCore 6.1.0属于.NET 6+版本,与.NET Core 5.0不兼容,会引发潜在冲突。建议降级到.NET 5.0兼容的包版本:

<PackageReference Include="Microsoft.Extensions.Logging" Version="5.0.0" />
<PackageReference Include="Serilog" Version="2.10.0" />
<PackageReference Include="Serilog.AspNetCore" Version="4.1.0" />
<PackageReference Include="Serilog.Extensions.Logging" Version="3.0.1" />
<PackageReference Include="Serilog.Settings.Configuration" Version="3.3.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="3.1.1" />
<PackageReference Include="Serilog.Sinks.File" Version="4.1.0" />

4. 验证Serilog配置

确保appsettings.json中的Serilog配置正确,示例:

{
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      }
    },
    "WriteTo": [
      { "Name": "Console" },
      {
        "Name": "File",
        "Args": {
          "path": "./logs/log-.txt",
          "rollingInterval": "Day"
        }
      }
    ]
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:47:35