在Azure函数中处置NLog

问题描述

我想在Azure Functions Startup类中添加NLog,如下所示:

public class Startup : Functionsstartup {
    public Startup()
    {        
        var logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
    }
    public override void Configure(IFunctionsHostBuilder builder) {
        ... other setup code
        builder.Services.AddLogging((loggingBuilder) =>
        {
            loggingBuilder.AddNLog();
        });
    }
}

根据Nlog,您应该使用NLog.LogManager.Shutdown()手动关闭记录器。 如何在Azure Function中处置NLog?

解决方法

如果我正确理解了您的问题,则希望在处置Azure Function实例时关闭NLog。在这种情况下,您可以执行以下操作:

public class Startup : FunctionsStartup {
    public Startup()
    {
        var logger = LogManager.Setup()
           .SetupExtensions(e => e.AutoLoadAssemblies(false))
           .LoadConfigurationFromFile("nlog.config",optional: false)
           .LoadConfiguration(builder => builder.LogFactory.AutoShutdown = false)
           .GetCurrentClassLogger();
    }

    public override void Configure(IFunctionsHostBuilder builder) {
        // other setup code
        builder.Services.AddLogging((loggingBuilder) =>
        {
            loggingBuilder.AddNLog(new NLogProviderOptions() { ShutdownOnDispose = true });
        });
    }
}

现在NLog将进入Microsoft Extension Logging的生存期(禁用AutoShutdown并启用ShutdownOnDispose