将NLog迁移至独立类库,同时保留原有Logger注入语法
解决方案:保留内置
ILogger<T>语法的同时迁移NLog到独立类库 完全可以做到不用修改控制器的注入代码,核心思路是在独立类库中封装NLog的配置逻辑,同时让ASP.NET Core的日志系统继续使用内置的ILogger<T>接口,底层仍然由NLog提供实现。以下是具体步骤:
1. 创建独立类库项目
新建一个.NET类库项目(比如命名为NLog.Logging),安装必要的NuGet包:
NLogNLog.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
相关产品推荐
相关产品推荐

