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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:30:36