ASP.NET Core 6 Web API中DI注入NLog及多项目共用自定义NLog配置包的配置问题
ASP.NET Core 6 Web API中DI注入NLog及多项目共用自定义NLog配置包的配置问题
Hey,我看出来问题出在哪了——你虽然把CustomConfiguration注入到DI容器里了,但全程没调用它的ConfigureLogger方法,反而用了NLog默认的LoadConfigurationFromAppSettings()去读配置文件,这就导致你自定义的日志规则完全没生效。下面给你一步步修正的方案:
第一步:先修复CustomConfiguration里的小bug
你代码里方法参数是fileLogging,但判断条件里写的是enableFileLogging,变量名不一致,先把这个小问题改了:
public class CustomConfiguration { public LoggingConfiguration ConfigureLogger(bool fileLogging = false) { var config = new LoggingConfiguration(); if (fileLogging) // 这里改成和参数一致的变量名 { var fileTarget = new FileTarget("fileTarget"); fileTarget.FileName = "logs/log.txt"; fileTarget.Layout = "${longdate} ${level:uppercase=true} - ${message}"; config.AddTarget("file", fileTarget); config.AddRule(LogLevel.Debug, LogLevel.Fatal, fileTarget); } return config; } }
第二步:修改Program.cs,正确调用自定义配置
你需要把默认的LoadConfigurationFromAppSettings()替换成调用你注入的CustomConfiguration实例的方法,具体代码调整如下:
var builder = WebApplication.CreateBuilder(args); // 1. 先把CustomConfiguration注册为单例服务 builder.Services.AddSingleton<CustomConfiguration>(); // 2. 临时构建服务提供者,获取CustomConfiguration的实例(因为此时WebApplication还没构建完成) var customConfig = builder.Services.BuildServiceProvider().GetRequiredService<CustomConfiguration>(); // 3. 使用自定义配置初始化NLog,替代默认的从配置文件读取 var logger = NLog.LogManager.Setup() .LoadConfiguration(configBuilder => configBuilder.LoggingConfiguration = customConfig.ConfigureLogger(fileLogging: true) // 这里可以根据需求传入是否开启文件日志 ) .GetCurrentClassLogger(); // 4. 清除默认日志提供器,启用NLog builder.Logging.ClearProviders(); builder.Host.UseNLog(); logger.Info("Service Init"); // 后续的WebApplication构建和中间件配置 var app = builder.Build(); // ... 你的其他中间件代码 ... app.Run();
额外优化建议
如果你想根据不同环境(开发/生产)动态控制日志配置,可以修改CustomConfiguration的方法,让它接收IConfiguration参数,从appsettings里读取配置项:
// 修改CustomConfiguration的方法 public LoggingConfiguration ConfigureLogger(IConfiguration configuration) { // 从appsettings里读取是否开启文件日志的配置 var enableFileLogging = configuration.GetValue<bool>("Logging:NLog:EnableFileLogging"); var config = new LoggingConfiguration(); if (enableFileLogging) { var fileTarget = new FileTarget("fileTarget"); fileTarget.FileName = "logs/log.txt"; fileTarget.Layout = "${longdate} ${level:uppercase=true} - ${message}"; config.AddTarget("file", fileTarget); config.AddRule(LogLevel.Debug, LogLevel.Fatal, fileTarget); } // 再加个控制台日志目标,方便开发环境调试 var consoleTarget = new ConsoleTarget("consoleTarget"); consoleTarget.Layout = "${longdate} ${level:uppercase=true} - ${message}"; config.AddTarget("console", consoleTarget); config.AddRule(LogLevel.Debug, LogLevel.Fatal, consoleTarget); return config; } // 然后Program.cs里调用时传入builder.Configuration var logger = NLog.LogManager.Setup() .LoadConfiguration(configBuilder => configBuilder.LoggingConfiguration = customConfig.ConfigureLogger(builder.Configuration) ) .GetCurrentClassLogger();
这样你就能在各个项目的appsettings.json里灵活配置日志开关了,同时复用公共包的配置逻辑~
备注:内容来源于stack exchange,提问作者rabner casandra
相关产品推荐
相关产品推荐

