如何为Azure功能配置NLog?何为、功能、Azure、NLog

2023-09-03 13:02:03 作者:`渃___①丗ゞ

我真的需要一些帮助。

我想将NLog与Azure Functions v2(目标框架.NET核心2.2)一起使用-并且已经创建了一个

Startup : FunctionsStartup
如何为 Azure 机器学习选择算法

装饰的类
[assembly: FunctionsStartup(typeof(PmsFunctions.Startup))]

并创建了此方法

public override void Configure(IFunctionsHostBuilder builder)
{
    builder.Services.AddLogging(loggingBuilder =>
    {
        loggingBuilder.ClearProviders();
        loggingBuilder.SetMinimumLevel(LogLevel.Trace);
        loggingBuilder.AddNLog();
    }).BuildServiceProvider();
}

在Startup类的构造函数中,我使用代码创建了NLog的配置:

var mailTarget = new MailTarget("mandrill")
{

    Html = true,
    AddNewLines = true,
    ReplaceNewlineWithBrTagInHtml = true,
    Subject = "XXXXX",
    To = "john@doe.com,
    From = "john@doe.com",
    Body = "Message: ${message}${newline}${newline}Date: ${date}${newline}${newline}Exception: ${exception:format=tostring}${newline}${newline}",
    SmtpUserName = "XXXXXXX",
    SmtpPassword = "XXXXXXX",
    SmtpAuthentication = SmtpAuthenticationMode.Basic,
    SmtpServer = "XXXXXXXX",
    SmtpPort = 587
};

var bufferedMailTarget = new BufferingTargetWrapper("bufferedMandril", mailTarget)
{
    SlidingTimeout = false,
    BufferSize = 100,
    FlushTimeout = 10000
};
config.AddTarget(bufferedMailTarget);

var mailRule = new LoggingRule("*", NLog.LogLevel.Warn, bufferedMailTarget);
config.LoggingRules.Add(mailRule);

var logger = NLogBuilder.ConfigureNLog(config).GetCurrentClassLogger

我尝试通过使用注入的ILogger在函数中使用记录器。它在本地运行得很好,但在使用Azure时完全"死"了。我想这就是我配置NLog的方式。

我应该如何做才是正确的?

推荐答案

若要确保NLog遵循Azure函数的生存期,则应将其配置为关闭(并刷新)和microsoft扩展日志记录:

[assembly: FunctionsStartup(typeof(MyNamespace.Startup))]

namespace MyNamespace
{
    public class Startup : FunctionsStartup
    {
        private readonly NLog.Logger Logger;

        public Startup()
        {
            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) =>
            {
                var nlogOptions = new NLogProviderOptions() {
                    ShutdownOnDispose = true, 
                    RemoveLoggerFactoryFilter = true
                };
                loggingBuilder.AddNLog(nlogOptions);
            });
        }
    }
}

通知ShutdownOnDispose = trueAutoShutdown = false