.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
相关产品推荐
相关产品推荐

