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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 10:39:40