如何在ASP.NET Core控制器中注入Serilog的ILogger接口
在ASP.NET Core中注入Serilog的ILogger接口
默认情况下,ASP.NET Core依赖注入容器里注册的是Microsoft.Extensions.Logging.ILogger<T>,而非Serilog自身的ILogger接口。要实现你想要的构造函数注入,得按下面几步配置:
1. 安装必要的NuGet包
首先确保你已经安装了Serilog的ASP.NET Core集成包:
Install-Package Serilog.AspNetCore
或者用.NET CLI执行:
dotnet add package Serilog.AspNetCore
2. 在Program.cs中配置Serilog并注册其ILogger接口
在.NET 6+的顶级语句Program.cs里,你需要先配置Serilog,再把它的ILogger实例注册到DI容器中。除了让Serilog成为默认日志提供器,还要显式注册Serilog的ILogger:
using Serilog; // 配置Serilog日志规则 Log.Logger = new LoggerConfiguration() .WriteTo.Console() // 示例输出到控制台,可替换为文件、ELK等其他Sink .CreateLogger(); var builder = WebApplication.CreateBuilder(args); // 替换ASP.NET Core默认日志提供器为Serilog builder.Host.UseSerilog(); // 显式将Serilog的ILogger注册到DI容器 builder.Services.AddSingleton<Serilog.ILogger>(Log.Logger); // 添加MVC相关服务 builder.Services.AddControllersWithViews(); var app = builder.Build(); // 中间件配置 app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();
3. 在控制器中注入Serilog的ILogger
现在你就可以像你示例里那样直接注入Serilog的ILogger了,不过要注意命名空间冲突:如果代码同时引用了Microsoft.Extensions.Logging和Serilog,ILogger会出现歧义,这里给你两种解决方式:
方式一:明确指定Serilog的命名空间
using Serilog; using Microsoft.AspNetCore.Mvc; public class HomeController : Controller { private readonly Serilog.ILogger _logger; public HomeController(Serilog.ILogger logger) { _logger = logger; } public IActionResult Index() { _logger.Information("Index was called"); return View(); } }
方式二:使用别名避免歧义
如果需要同时使用两种日志接口,可以给Serilog的ILogger加别名:
using SerilogLogger = Serilog.ILogger; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; // 同时兼容Microsoft的ILogger<T> public class HomeController : Controller { private readonly SerilogLogger _serilogLogger; private readonly ILogger<HomeController> _msLogger; // 同时注入两种日志接口 public HomeController(SerilogLogger serilogLogger, ILogger<HomeController> msLogger) { _serilogLogger = serilogLogger; _msLogger = msLogger; } public IActionResult Index() { _serilogLogger.Information("Index was called (Serilog)"); _msLogger.LogInformation("Index was called (Microsoft ILogger)"); return View(); } }
额外说明
其实如果你的需求只是用Serilog作为底层日志实现,同时继续使用Microsoft的ILogger<T>接口,那只需要builder.Host.UseSerilog()这一步就够了——因为Serilog.AspNetCore已经把自己集成到了ASP.NET Core的日志系统里,ILogger<T>的调用最终会转发到Serilog。但你明确要求注入Serilog自身的ILogger,所以上面的显式注册步骤是必须的。
内容的提问来源于stack exchange,提问作者Lindsey1986
相关产品推荐
相关产品推荐

