如何为Azure功能配置NLog?

时间:2019-06-09 07:12:05

标签: c# azure-functions nlog

我真的需要一些帮助。

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

Startup : FunctionsStartup

装饰有

的类
[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的方式。

我应该如何正确做呢?

3 个答案:

答案 0 :(得分:0)

我就是这样设置我的,并且我已经成功地从Azure中的服务中获取了电子邮件(我设置了一个函数来明确记录警告,因此当我调用它时,会收到电子邮件)。

public Startup()
{
    LoggingConfiguration config = new LoggingConfiguration();

    var mailTarget = new MailTarget("mandrill")
    {
        Html = true,
        AddNewLines = true,
        ReplaceNewlineWithBrTagInHtml = true,
        Subject = "Test...",
        To = "-----",
        From = "john@doe.com",
        Body = "Message: ${message}${newline}${newline}Date: ${date}${newline}${newline}Exception: ${exception:format=tostring}${newline}${newline}",
        SmtpUserName = "-----",
        SmtpPassword = "-----",
        SmtpAuthentication = SmtpAuthenticationMode.Basic,
        SmtpServer = "-----",
        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);

    NLogBuilder.ConfigureNLog(config);
}

public override void Configure(IFunctionsHostBuilder builder)
{
    builder.Services.AddLogging(b =>
    {
        b.AddNLog();
    });
}

答案 1 :(得分:0)

使用MicrosoftILoggerTarget:

var loggerTarget = new NLog.Extensions.Logging.MicrosoftILoggerTarget(azureILogger);
loggerTarget.Layout = new NLog.Layouts.Layout("${message}${exception:format=tostring}");  // Can also be JsonLayout
var nlogConfig = new NLog.Config.LoggingConfiguration();
nlogConfig.AddRuleForAllLevels(loggerTarget);
NLog.LogManager.Configuration = nlogConfig;
var nlogLogger = NLog.LogManager.GetCurrentClassLogger();
nlogLogger.Info("Hello World");

来源:https://github.com/NLog/NLog.Extensions.Logging/wiki/NLog-cloud-logging-with-Azure-function-or-AWS-lambda

答案 2 :(得分:0)

要确保NLog遵循Azure函数的生存期,则应将其配置为与Microsoft-Extension-Logging一起关闭(并刷新):

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

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

        public Startup()
        {
            Loggger = 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.SetMinimumLevel(LogLevel.Trace); // Update default MEL-filter
                loggingBuilder.AddNLog(new NLogProviderOptions() { ShutdownOnDispose = true });
            });
        }
    }
}

通知ShutdownOnDispose = trueAutoShutdown = false