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

将NLog迁移至独立类库,同时保留原有Logger注入语法

解决方案:保留内置ILogger<T>语法的同时迁移NLog到独立类库

完全可以做到不用修改控制器的注入代码,核心思路是在独立类库中封装NLog的配置逻辑,同时让ASP.NET Core的日志系统继续使用内置的ILogger<T>接口,底层仍然由NLog提供实现。以下是具体步骤:

1. 创建独立类库项目

新建一个.NET类库项目(比如命名为NLog.Logging),安装必要的NuGet包:

  • NLog
  • NLog.Web.AspNetCore

2. 在类库中封装NLog配置逻辑

在类库中添加静态扩展类,把NLog的初始化和服务注册逻辑封装进去:

using Microsoft.Extensions.Hosting;
using NLog;
using NLog.Web;
using System.IO;

namespace NLog.Logging;

public static class NLogExtensions
{
    public static IHostBuilder UseNLogFromLibrary(this IHostBuilder hostBuilder)
    {
        // 加载NLog配置,可根据实际路径调整
        var logger = LogManager
            .LoadConfiguration(Path.Combine(Directory.GetCurrentDirectory(), "/Configs/NLog/nlog.config"))
            .Setup()
            .SetupExtensions(x => x.RegisterLayoutRenderer<BuildConfigLayoutRenderer>("BuildConfiguration"))
            .GetCurrentClassLogger();
        
        logger.Debug("NLog已从类库完成初始化");
        
        // 将NLog注册到ASP.NET Core日志系统
        return hostBuilder.UseNLog();
    }
}

提示:如果你的BuildConfigLayoutRenderer是自定义布局渲染器,需要将其一同迁移到这个类库中。

3. 修改Web API项目的Program.cs

移除Web API项目中直接引用的NLog相关包,添加对上述类库的引用,然后更新Program.cs:

using NLog.Logging;

try
{
    var builder = WebApplication.CreateBuilder(args);

    // 调用类库中的扩展方法注册NLog
    builder.Host.UseNLogFromLibrary();

    builder.Services.AddControllers();
    builder.Services.AddEndpointsApiExplorer();
    builder.Services.AddSwaggerGen();

    var app = builder.Build();

    if (app.Environment.IsDevelopment())
    {
        app.UseSwagger();
        app.UseSwaggerUI();
    }

    app.UseHttpsRedirection();
    app.UseAuthorization();
    app.MapControllers();

    app.Run();
}
catch (Exception exception)
{
    // 捕获启动异常并记录
    var logger = LogManager.GetCurrentClassLogger();
    logger.Error(exception, "程序因异常终止");
    throw;
}
finally
{
    LogManager.Shutdown();
}

4. 验证控制器注入逻辑

控制器中原有的ILogger<T>注入代码完全无需修改,可正常使用:

private readonly ILogger<MyController> _logger;

public MyController(ILogger<MyController> logger)
{
    _logger = logger;
}

[HttpGet]
public IActionResult Get()
{
    _logger.LogInformation("通过内置ILogger接口记录日志,底层由NLog实现");
    return Ok();
}

关键原理

ASP.NET Core日志系统基于抽象层设计,ILogger<T>是框架提供的通用日志接口,而NLog.Web.AspNetCore已经实现了该接口的适配逻辑。我们只是把NLog的配置与注册逻辑封装到类库中,并未改变ASP.NET Core日志系统的依赖注入关系,因此控制器可以继续沿用原有ILogger<T>的注入方式。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 03:45:41