自定义MyLogger结合NLog.Extensions.Logging的配置方案问询
解决方案
一、通过NLog.Extensions.Logging集成自定义MyLogger
完全可以实现,步骤如下:
- 手动注册自定义Layout渲染器
在应用启动最开始处完成注册,确保在加载NLog配置前执行:
// 注册自定义Layout渲染器(假设你的渲染器类名为MyCustomRenderer) LayoutRenderer.Register("my-custom-renderer", typeof(MyCustomRenderer));
- 初始化NLog并绑定依赖注入
先加载NLog.config配置,再将自定义MyLogger注册到DI容器:
// 加载NLog.config配置文件 NLog.LogManager.LoadConfiguration("NLog.config"); // 构建DI容器 var services = new ServiceCollection(); // 注册IMyLogger实例,复用NLog的Logger核心逻辑 services.AddScoped<IMyLogger>(sp => new MyLogger(NLog.LogManager.GetCurrentClassLogger()) ); // 同时注册MS日志基础设施的NLog提供器(若需使用ILogger) services.AddLogging(builder => { builder.ClearProviders(); builder.AddNLog(); }); var serviceProvider = services.BuildServiceProvider();
注:MyLogger的构造函数需接收NLog.Logger实例(与官方继承示例结构一致),这样就能直接复用NLog.config的配置规则。
- POC验证
在演示代码中直接获取实例测试:
var myLogger = serviceProvider.GetRequiredService<IMyLogger>(); myLogger.Info("自定义日志器测试输出");
确认NLog.config中配置的输出目标(如控制台、文件)能正常接收日志。
二、折中方案:共享NLog.config配置
若集成遇到阻碍,让MS日志的NLog提供器与自定义MyLogger共享配置的核心是复用同一个NLog.LogManager实例,步骤如下:
- 全局统一加载NLog配置
应用启动时仅加载一次配置,避免重复加载导致的冲突:
// 全局加载NLog.config,所有Logger实例都会复用此配置 NLog.LogManager.LoadConfiguration("NLog.config");
- 注册MS日志的NLog提供器
保持常规的MS日志集成流程:
services.AddLogging(builder => { builder.ClearProviders(); builder.AddNLog(); // 自动复用已加载的NLog.config });
- 初始化自定义MyLogger
创建MyLogger时直接通过LogManager获取Logger实例:
services.AddScoped<IMyLogger>(sp => new MyLogger(NLog.LogManager.GetLogger("MyLogger")) );
此时,无论是MS日志注入的ILogger,还是自定义的IMyLogger,都会使用同一套NLog配置(包括日志级别、输出目标、自定义渲染器等)。
关键注意事项
- 自定义Layout渲染器必须在
LoadConfiguration之前注册,否则NLog无法识别配置文件中的自定义渲染器标签。 - MyLogger需保持与官方示例一致的结构(继承
NLog.Logger或持有NLog.Logger实例),才能复用NLog的配置逻辑。 - 若需为MyLogger单独设置规则,可在NLog.config中添加针对指定Logger名称(如"MyLogger")的过滤规则。
内容的提问来源于stack exchange,提问作者rychlmoj
相关产品推荐
相关产品推荐

